#include<cstring>
#include<iostream>
#include<string>
#include<ctime>
#include<cstdlib>
using namespace std;
int main()
{
int i,time1,time2,time3,timec=0,times=0;
time1 = clock();
for (i=0;i <= 5000000; i++) void();
time2 = clock();
time3 = time2 - time1;
printf("5000000次加法所花时间:%dms\n\n\n",time3);
{
char a[]="asdifkhvlanlawoeifdyuhoijqwoienvklsaoiyudpify7382109r789hvoih298375489yhvoiaoiuy39876890rfhoiajsdoify9827r89fhoaijhdsflkjaklsdjfklasjldkfjoiyr890ghoiavhsdowe";
char temp[160];
char b[]="hvoih29";
char c[]="asdifkhvlanlawoeifdyuhoijqwoienvklsaoiyudpify7382109r789hvoih298375489yhvoiaoiuy39876890rfhoiajsdoify9827r89fhoaijhdsflkjaklsdjfklasjldkfjoiyr890ghoiavhsdow2";
char * pos;
int t;
time1 = clock();
for (i=0;i <= 5000000; i++)
{
strcpy(temp,a);
}
time2 = clock();
timec = time2-time1-time3;
printf("char *复制5000000次所花时间:%dms\n",time2-time1-time3);
time1 = clock();
for (i=0;i <= 5000000; i++)
{
pos = strstr(b,temp);
}
time2 = clock();
timec = timec + time2 - time1 - time3;
printf("char *查找子串5000000次所花时间:%dms\n",time2-time1-time3);
time1 = clock();
for (i=0;i <= 5000000; i++)
{
t = strcmp(temp,c);
}
time2 = clock();
timec = timec + time2 - time1 - time3;
printf("char *比较5000000次所花时间:%dms\n",time2-time1-time3);
}
printf("char *三项操作所花时间:%dms\n\n\n",timec);
{
string a = "asdifkhvlanlawoeifdyuhoijqwoienvklsaoiyudpify7382109r789hvoih298375489yhvoiaoiuy39876890rfhoiajsdoify9827r89fhoaijhdsflkjaklsdjfklasjldkfjoiyr890ghoiavhsdowe";
string b = "hvoih29";
string c= "asdifkhvlanlawoeifdyuhoijqwoienvklsaoiyudpify7382109r789hvoih298375489yhvoiaoiuy39876890rfhoiajsdoify9827r89fhoaijhdsflkjaklsdjfklasjldkfjoiyr890ghoiavhsdow2";
int pos;
bool t;
string temp;
time1 = clock();
for (i=0;i <= 5000000; i++)
{
temp = a;
}
time2 = clock();
times = times + time2 - time1 - time3;
printf("string复制5000000次所花时间:%dms\n",time2-time1-time3);
time1 = clock();
for (i=0;i <= 5000000; i++)
{
pos = temp.find(b);
}
time2 = clock();
times = times + time2 - time1 - time3;
printf("string查找子串5000000次所花时间:%dms\n",time2-time1-time3);
time1 = clock();
for (i=0;i <= 5000000; i++)
{
t = temp == c ;
}
time2 = clock();
times = times + time2 - time1 - time3;
printf("string比较5000000次所花时间:%dms\n",time2-time1-time3);
}
printf("string三项操作所花时间:%dms\n",times);
system("pause");
}
今天在与yucenh讨论STL的时候,想到一个问题,曾经听说C++的string是用类实现的,所以,效率很低,感觉到有些怀疑,就做了一个测试。测试结果如下:
测试采用的机子:Intel Core2 Duo CPU T5870 @ 2.00GHz 1.86GB内存
VC++ 6.0
5000000次加法所花时间:62ms
char *复制5000000次所花时间:360ms
char *查找子串5000000次所花时间:16ms
char *比较5000000次所花时间:1126ms
char *三项操作所花时间:1502ms
string复制5000000次所花时间:1938ms
string查找子串5000000次所花时间:1516ms
string比较5000000次所花时间:1672ms
string三项操作所花时间:5126ms
Dev-C++ gcc 3.4.2
5000000次加法所花时间:16ms
char *复制5000000次所花时间:343ms
char *查找子串5000000次所花时间:109ms
char *比较5000000次所花时间:1187ms
char *三项操作所花时间:1639ms
string复制5000000次所花时间:156ms
string查找子串5000000次所花时间:9969ms
string比较5000000次所花时间:2859ms
string三项操作所花时间:12984ms
CodeBlocks gcc 4.4.1
5000000次加法所花时间:31ms
char *复制5000000次所花时间:485ms
char *查找子串5000000次所花时间:78ms
char *比较5000000次所花时间:1173ms
char *三项操作所花时间:1736ms
string复制5000000次所花时间:125ms
string查找子串5000000次所花时间:1329ms
string比较5000000次所花时间:859ms
string三项操作所花时间:2313ms
另外在丫头那测试了下VS2008的结果:
5000000次加法所花时间:15ms
char *复制5000000次所花时间:345ms
char *查找子串5000000次所花时间:156ms
char *比较5000000次所花时间:610ms
char *三项操作所花时间:1111ms
string复制5000000次所花时间:735ms
string查找子串5000000次所花时间:1501ms
string比较5000000次所花时间:1953ms
string三项操作所花时间:4189ms
通过测试可以发现,使用微软系的编译器,string花费的时间比char *多出一倍多,特别是查找字符串,有近10倍的差距。
而gcc系,3.4.2这个Dev-C++默认带的版本,在查找方面更是相差了90倍,4.4.1这个版本也有20倍的差距,对比可以发现,4.4的效率较3.4有了明显的提高。不过,很神奇的是,在字符串复制和比较操作上,string所花费的时间较char *还要少。
如果不是涉及到字符串的查找,那么在比赛中,熟悉string的情况下,尽量使用string,不仅方便,安全,而且,效率上的差距基本上也是不多的,特别是使用gcc的情况下。