2011-02-05 194 views
9

我在幾本書中發現了關於避免使用字符串進行值比較(特別是在循環中)的註釋,因爲字符串比較慢得多(使用std :: string)。但爲什麼呢?爲什麼整數比較比字符串比較快?

是因爲CPU中的整數單元工作更快?

字符串應該在字節我猜,所以不會一個字節比較平等地做這項工作嗎?

謝謝!

回答

21

使用整數,機器級別上存在可以在一個週期內執行比較的指令。

然而,一個字符串由很多字符組成。爲了比較字符串,在最壞的情況下,你必須查看字符串的每個字符。

實際上,當你比較字符串時,你很可能使用字符串中每個字符的整數比較。與比較兩個整數相比,您可能很快會看到它如何快速變成大量比較。

例子:如果你想1073741823

  • 字符串比較比較1073741822:您要比較各個手指一個接一個。這是10個比較,因爲整數只與最後一個數字不同。
  • 整數比較:您可以在一次比較中做到這一點,與字符串比較相比可節省9次比較。

這有點簡化,很自然,但有希望得到重點。

+0

實際上,每個字符比較兩個字符(針對另一個字符串,針對終止字符串的NUL或計數字符串的長度)。但是在一次整數比較中,SSE可以執行16次比較。 – 2011-02-05 00:22:40

+1

@Voigt:忘記了'\ 0`的比較,但是,我想我會像這樣離開它。不想過於具體並失去大局。 :) – 2011-02-05 00:29:08

12

問題是,字符串比較不只是一個單一的比較,它是一個循環中的整個序列。如果比較兩個字符串,每個字符長度爲10001個字符且前9000個字符相同,您會發生什麼?

順便說一句,SSE使得字符串比一個字符比一個LOT更快,但它永遠無法達到整數比較的速度。

+0

...而int比較可以在_significantly_指令中完成。 – 2011-02-05 00:16:49

0

編譯器可以優化整數比較,直接發生在cpu寄存器內部。

1

混淆地說,字符串比較需要n個整數比較,其中n是字符串的大小,而如果您認爲比例明智,則整數比較只是一個比較。這是比較字符串時可能會發生什麼的一個粗略想法!

因此,明顯的字符串比較是一個較慢的過程,因爲它是n個整數比較(大約)

0

整數通常是-bytes。

字符串和之間的任何1無窮*字節。

*嘿,你明白我的意思了,是嗎?