char*和string

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值