为什么用C的strcmp会比C++的compare快这么多????

穷人家的老狗 2005-01-13 04:48:12
#include<iostream>
#include<string>
#include <ctime>

using namespace std;

void main()
{
clock_t start;
string strname="luyajun",strfind="liaoyan";
char *cstrname="luyajun",*cstrfind="liaoyan";
start=clock();
const long sleep=10000000;

for(int i=0;i<sleep;i++)
{
strcmp(cstrname,cstrfind);
}
printf("循环%d次,C strcmp所用时间为:%2.4f\n",sleep,(double)(clock()-start)/CLOCKS_PER_SEC);


start=clock();
for(int i=0;i<sleep;i++)
{
strname.compare(strfind);
}
printf("循环%d次,C++String类所用时间为:%2.4f\n",sleep,(double)(clock()-start)/CLOCKS_PER_SEC);
}


上面程序在我的系统上C的strcmp是0.1100,C++的compare是6.2490????
...全文
1147 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ilovevc 2005-01-14
  • 打赏
  • 举报
回复
确实说的不对。以前是看比例,认为strcmp速度都一样。

循环同样次数:

strcmp vs VC6自带的 大约是 0.22 vs 1.41
strcmp vs stlport vc6 大约是 0.22 vs 1.39
strcmp vs vc7 大约是 1.25 vs 1.53

发现vc7速度还没有上去,倒是将strcmp的速度拖下来了。我以前还以为它和strcmp一样快,结果是strcmp和它一样慢。
  • 打赏
  • 举报
回复
avalonBBS()SBBnolava()avalonBBS() :

你用了 value += .... , 但最后又没有用 value 啊, 还是被优化掉了,在我这两个都是用时 0 , 最后加一句 cout << value << endl; 结果C++速度慢了一半,不过如果是用 string1 == string2 , 并且两个字符串长度不相等的情况下,结果C++速度快了N多倍.

icc + stlport , stlport 编译时没开全局优化( 开了全局优化后我的机器跑不动了,编译了半小时还出不来结果, 机器内存太小了, 晚上回家换台机器试试 ).

ilovevc(ilovevc)
---------------------------------
STLPort 性能差吗,有测试数据吗?
flamingheart 2005-01-13
  • 打赏
  • 举报
回复
请问各位是怎么优化的啊?
ilovevc 2005-01-13
  • 打赏
  • 举报
回复
楼上说的有道理。
不过VC6带的确实差,STLPort好像更差。VC7带的效率极高。
  • 打赏
  • 举报
回复
你的程序对C++是很不公平的,string里保存了字符串长度,在字符串很短的时候,运行的大部分时间都是在取得字符串的长度,在字符串比较长的时候,C++版就跟C版基本一样了,在 == , != 的时候,如果两个字符串长度不同,C++版比C版就有可能快多了. TNND,vc自带的stl好像是差了不是一点点,下面的程序跑起来, icl 版的竟然比 gcc 版的慢了差不多一倍.

像改成这样:
int i; char cstrname[1024], cstrfind[1024];

for( i = 0; i < 500; ++i )
{
cstrname[i] = cstrfind[i] = 'a' + rand() % 20;
}
for( ; i < sizeof( cstrname ) - 1; ++i )
{
cstrname[i] = 'a' + rand() % 20;
cstrfind[i] = 'a' + rand() % 20;
}
cstrfind[i] = cstrname[i] = 0;

string strname=cstrname ,strfind=cstrfind;

结果是:
-----------------------------------------------------------
循环10000000次,C strcmp所用时间为:11.2660
循环10000000次,C++String类所用时间为:11.2460
flamingheart 2005-01-13
  • 打赏
  • 举报
回复
楼上的程序是什么意思阿?
我怎么看不懂呢?
avalonBBS 2005-01-13
  • 打赏
  • 举报
回复
strcmp("asdfkj","asdkfj");<----------这样被优化掉了??*_* 晕,感觉真的是这样哦

//////////////////////////////
#include <iostream>
#include <string>
#include <windows.h>

using namespace std;
const long sleep=10000000;
void main()
{
string strname="luyajun",strfind="liaoyan";
const char *cstrname="luyajun",*cstrfind="liaoyan";
unsigned t;
int i,value;

value=0;
t=GetTickCount();
for(i=0;i<sleep;i++)
{
value+=strname.compare(strfind);
}
cout<<"循环"<<sleep<<"次,C++String类所用时间为:"<<GetTickCount()-t<<endl;


value=0;
t=GetTickCount();
for(i=0;i<sleep;i++)
{
value+=strcmp(cstrname,cstrfind);
}
cout<<"循环"<<sleep<<"次,strcmp()所用时间为:"<<GetTickCount()-t<<endl;
}


循环10000000次,C++String类所用时间为:931
循环10000000次,strcmp()所用时间为:160
  • 打赏
  • 举报
回复
avalonBBS()SBBnolava()avalonBBS()
-------------------------------------------
你哪个结果是不行的,上面的C版的会被优化掉, 即使你 for( i = 0; i < 0XFFFFFFFF; ++i ) strcmp( ..... ); 运行结果照样是0 .
  • 打赏
  • 举报
回复
唉,C++还是慢了好多哦,特别是 gcc , cl 简直惨不忍睹啊,为什么 icl 会跑的快这么多地.

cl -O2 -GX test.cpp -link -out:cl_v.exe
icl -O3 -fast test.cpp -link -out:icl_v.exe
g++ -O2 test.cpp -out:gcc_v.exe

$cl_v
循环10000000次,C strcmp所用时间为:0.0700
循环10000000次,C++String类所用时间为:0.4900
20000000

$icl_v
循环10000000次,C strcmp所用时间为:0.0700
循环10000000次,C++String类所用时间为:0.1700
20000000

$gcc_v
循环10000000次,C strcmp所用时间为:0.1800
循环10000000次,C++String类所用时间为:0.8210
avalonBBS 2005-01-13
  • 打赏
  • 举报
回复
不太清楚,第一个代码我拿在vc6下debug编译,时间确实差得不是一点点,即使如下
for(i=0;i<sleep;i++)
{
//strname.compare(strfind);
strname == strfind;
}
也同样是的。

但改成vc6 release编译,时间就很接近了
循环10000000次,C strcmp所用时间为:0.0000
循环10000000次,C++String类所用时间为:0.0200
  • 打赏
  • 举报
回复
程序改成:

void main()
{
clock_t start;
string strname="luyajun",strfind="liaoyan";
char *cstrname="luyajun",*cstrfind="liaoyan";
start=clock();
const long sleep=10000000;

int val = 0;
for(int i=0 ;i<sleep;i++)
{
val += strcmp(cstrname,cstrfind);
}
printf("Ñ­»·%d´Î£¬C strcmpËùÓÃʱ¼äΪ£º%2.4f\n",sleep,(double)(clock()-start)/CLOCKS_PER_SEC);

start=clock();
for(int i=0 ;i<sleep;i++)
{
val += strname.compare(strfind);
}
printf("Ñ­»·%d´Î£¬C++StringÀàËùÓÃʱ¼äΪ£º%2.4f\n",sleep,(double)(clock()-start)/CLOCKS_PER_SEC);

printf( "%d\n" , val );
}
运行时间基本接近.
  • 打赏
  • 举报
回复
这段代码在-O2优化下不生成代码,因此运行时间为 0.
for(int i=0;i<sleep;i++)
{
strcmp(cstrname,cstrfind);
}

65,212

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧