【发布时间】:2014-01-11 03:56:11
【问题描述】:
我写了一个函数Str::Compare,它基本上是用另一种方式重写的strcmp。
在比较这两个函数时,在一个重复 500'000'000 次的循环中,strcmp 执行速度太快了,大约快 x750 倍。
此代码在 C 库中编译,-Os 参数处于活动状态:
int Str::Compare(char* String_1, char* String_2)
{
char TempChar_1, TempChar_2;
do
{
TempChar_1 = *String_1++;
TempChar_2 = *String_2++;
} while(TempChar_1 && TempChar_1 == TempChar_2);
return TempChar_1 - TempChar_2;
}
那个函数的执行时间是3.058s,而strcmp只有0.004s。
为什么会这样?
这也是我实现基准循环的方式:
int main()
{
char Xx[] = {"huehuehuehuehuehuehuehuehuehuehuehuehuehue"},
Yy[] = {"huehuehuehuehuehuehuehuehuehuehuehuehuehue"};
for(int i = 0; i < 500000000; ++i)
Str::Compare(Xx, Yy);
}
编辑:
在测试我编写的一些代码和优化时,Str::Compare 的速度得到了极大的提高。
如果之前strcmp 的速度是 x750 倍,那么现在只有 x250。这是新代码:
int Str::Compare(char* String_1, char* String_2)
{
char TempChar_1, TempChar_2, TempChar_3;
while(TempChar_1 && !TempChar_3)
{
TempChar_1 = *String_1++;
TempChar_2 = *String_2++;
TempChar_3 = TempChar_1 ^ TempChar_2;
}
return TempChar_1 - TempChar_2;
}
新的执行时间是0.994s。
【问题讨论】:
-
你为什么不做
while(*str1++ == *str2++); -
因为那段代码是这个函数最低效的实现。
-
1Str::Compare的编辑版本不好-TempChar_3在初始化之前使用,2VS2010为原始功能生成的代码几乎和strcmp一样快。3很难通过简单的实现来击败大规模优化的功能(甚至是内在的!)。 -
解释为什么?该代码类似于 strcpy afaik 的标准 imp
-
while(*str_1 && *str_1++ == *str_2++);其实是正确的形式。这更慢,原因很简单,处理器必须每次都解析指针的地址,并且性能损失。
标签: c++ performance time strcmp