【发布时间】:2011-06-21 17:02:01
【问题描述】:
我在几本书中发现 cmets 关于避免使用字符串来比较值(尤其是在循环中),因为字符串比较要慢得多(使用 std::string)。但究竟为什么呢?
是因为 cpu 中的整数单位工作得更快吗?
我猜字符串应该以字节为单位,所以字节比较不是同样有效吗?
谢谢!
【问题讨论】:
我在几本书中发现 cmets 关于避免使用字符串来比较值(尤其是在循环中),因为字符串比较要慢得多(使用 std::string)。但究竟为什么呢?
是因为 cpu 中的整数单位工作得更快吗?
我猜字符串应该以字节为单位,所以字节比较不是同样有效吗?
谢谢!
【问题讨论】:
对于整数,存在机器级别的指令,可以在一个周期内执行比较。
然而,一个字符串由很多字符组成。为了比较字符串,在最坏的情况下,您必须查看字符串的每个字符。
事实上,当您比较字符串时,您很可能对字符串中的每个字符使用整数比较。与比较两个整数相比,您可能会看到这很快就会变成很多比较。
示例:如果您想将 1073741822 与 1073741823 进行比较。
这自然是有点简化了,但希望能明白这一点。
【讨论】:
\0 的比较,但是是的,我想我会这样。不想太具体而失去大局。 :)
问题在于字符串比较不仅仅是一个单一的比较,它是一个循环中的一个完整序列。如果您比较两个长度均为 10001 个字符且前 9000 个字符相同的字符串,您期望会发生什么?
BTW SSE 使字符串比较比一次一个字符快很多,但它永远无法达到整数比较的速度。
【讨论】:
编译器可以优化整数比较,使其直接在 cpu 寄存器内进行。
【讨论】:
模糊地说,字符串比较需要 n 次整数比较,其中 n 是字符串的大小,而整数比较只是一种比较,如果你认为是比率的话。这是比较字符串时可能发生的情况的一个粗略概念!
显然字符串比较会是一个较慢的过程,因为它是 n 次整数比较(近似)。
【讨论】:
strlen+1 是一个上限,当你有一个 SIMD 单元时,需要的比较会更少。不过是 O(N)。
整数通常是4-字节。
字符串介于 1 和 infinity* 字节之间。
*嘿,你明白我的意思,不是吗?
【讨论】: