char*和string

来源:互联网 发布:麻将手游源码 编辑:程序博客网 时间:2024/05/21 08:02
#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的情况下。

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 电脑放不了dvd光盘怎么办 股东迟迟不交齐股本金怎么办 wps转pdf就乱了怎么办 被有用分期骗了怎么办 找不到以前有用分期的账号怎么办 打工去韩国不懂韩语怎么办? 想去韩国整容没钱怎么办 专接本没接上怎么办 抄写经文写错了怎么办 在外地修车被宰怎么办 国外汇款公司名称写错了怎么办 增值税专票没有机器编码怎么办 发票右上角的编码打不全怎么办 税票名称开错了怎么办 开票名称开错了怎么办 退休党员不交党费怎么办 cad打不出来字怎么办 用cad打不出来字怎么办 打字总打错字母怎么办 mac做ppt卡住了怎么办 mac的ppt卡住了怎么办 淘宝店铺被屏蔽了怎么办 淘宝申请售后卖家拒绝怎么办 淘宝投诉卖家入口关闭怎么办 遇见最喜欢孩子的父母怎么办 房屋备案表丢了怎么办 淘宝发布商品没有品牌怎么办 电子发票名称写错了怎么办 合同写错了划掉怎么办 进京证日期错了怎么办 买车时谈的协议与合同不一致怎么办 新车上牌找不到流水号怎么办 开票数量比入库数量少怎么办 我贷款的app忘了怎么办 网贷名字忘了怎么办 附件太大邮件发不出去怎么办 孩子出生足印单子丢了怎么办 保险名字写错了怎么办 行驶证和身份证名字不一样怎么办 上户后发现合格证和车不一样怎么办 新车上户重量不一样怎么办