2016-05-22 50 views
-4

原來的問題被糟糕的收到,並得到許多downvotes。所以我想我會修改這個問題,讓它更容易閱讀,並希望對任何看到它的人有更多的幫助。最初的問題是爲什麼strlen()比手動循環查找字符串並找到'\ 0'字符的速度快20倍。我認爲這個問題是有根據的,因爲我讀過strlen()的技術來查找字符串長度本質上是循環的,直到找到一個空終止字符'\ 0'。這是對C字符串的一種常見批評,其原因不止一個。正如很多人指出的那樣,作爲C庫一部分的函數是由智能程序員創建的,以最大限度地提高性能。爲什麼strlen()比手動循環檢查以空字符終止字符快20倍?

感謝ilen2,他將我與一個非常聰明的使用按位運算符一次檢查8個字節的方法聯繫起來,我設法得到了一些字符串,比大約8到15個字符比strlen快( ),並且當字符串比較大時,比strlen()快很多倍。例如,奇怪的是,strlen()似乎是線性時間依賴於要完成的字符串的長度。另一方面,不管字符串的長度(我測試了幾百個),自定義的時間花費的時間幾乎相同。無論如何,我的結果是相當令人驚訝的,我做了他們優化關閉,我不知道他們是多麼有效。非常感謝ilen2的鏈接和John Zwinck。有趣的是,John Zwinck建議SIMD作爲strlen()可能會更快的可能性,但我對此一無所知。

+1

您的字符計數實現使用每循環兩個加法。我可以想出一種方法,只使用1個方法。 – ilent2

+5

一個是對優化庫的庫調用,另一個是未經優化的程序集的一部分,而不是最優化的算法?這就像問:「爲什麼使用烤箱更快地把雞蛋放在冰箱旁邊的包裏?」 – Yakk

+3

我也期待與最佳化開啓編譯器可能能夠確定計算字符串的長度可以在編譯時完成,所以這不是一個最好的例子。一個更好的例子可能是首先將不同長度的字符串加載到內存中(從文件或其他地方),然後確定它們的長度。 – ilent2

回答

5

strlen()是一個非常重擊功能,你可以打賭,一些非常聰明的人花了幾天和幾個月對其進行優化。一旦你的算法正確,接下來的事情是,你能一次檢查多個字節嗎?答案當然是,你可以使用SIMD(SSE)或其他技巧。如果您的處理器可以同時對128位進行操作,這是每時鐘16個字符,而不是1

+0

我寫了一些基於ilent2提供的鏈接,它一次檢查8個字節,至今檢測速度比strlen()快4倍,我非常高興,但還有更多工作要做。使用SIMD會很有趣,我不知道如何使用它。 – Zebrafish