2011-02-05 201 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无穷*字节。

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