我寫了一個函數,Str::Compare
,那基本上是用另一種方式重寫的strcmp
。 雖然比較這兩個函數,在一個循環中重複500'000'000次,執行速度太快,大約快了x750倍。爲什麼strcmp比我的函數快得多?
此代碼被編譯成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 ++);' – texasbruce
因爲那個代碼是這個函數最沒有效率的實現。 – EnryFan
'1'編輯後的版本'Str :: Compare'不好 - 'TempChar_3'被初始化之前使用,'2'由VS2010產生的原始函數的代碼幾乎和'strcmp'一樣快。 '3'很難通過簡單的實現來大規模優化功能(甚至是固有的!)。 –