#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的情況下。