char*和string

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章