我编写了一个函数,Str::Compare
,基本上是另一种方式重新编写的strcmp
。
在比较这两个函数时,在循环中重复500'000'000次,strcmp
执行得太快了,大约x750倍。
这段代码是在启用了-Os
参数的C库中编译的:
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.058秒
,而strcmp
只需0.004秒
。
为什么会这样呢?
这是我实现基准测试循环的方式:
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.994秒
。
while(*str1++ == *str2++);
呢? - SwiftMangoStr::Compare
版本不好-在初始化之前就使用了TempChar_3
。strcmp
一样快。while(*str_1 && *str_1++ == *str_2++);
这是正确的形式。但这种方式更慢,因为处理器必须每次解析指针的地址,从而导致性能损失。 - EnryFan