【问题标题】:Why is integer comparison faster then string comparison?为什么整数比较比字符串比较快?
【发布时间】:2011-06-21 17:02:01
【问题描述】:

我在几本书中发现 cmets 关于避免使用字符串来比较值(尤其是在循环中),因为字符串比较要慢得多(使用 std::string)。但究竟为什么呢?

是因为 cpu 中的整数单位工作得更快吗?

我猜字符串应该以字节为单位,所以字节比较不是同样有效吗?

谢谢!

【问题讨论】:

    标签: c++ string stl


    【解决方案1】:

    对于整数,存在机器级别的指令,可以在一个周期内执行比较。

    然而,一个字符串由很多字符组成。为了比较字符串,在最坏的情况下,您必须查看字符串的每个字符。

    事实上,当您比较字符串时,您很可能对字符串中的每个字符使用整数比较。与比较两个整数相比,您可能会看到这很快就会变成很多比较。

    示例:如果您想将 1073741822 与 1073741823 进行比较。

    • 字符串比较:您必须逐个比较每个数字。这是 10 次比较,因为整数只相差最后一位。
    • 整数比较:您可以在一次比较中完成此操作,与字符串比较相比,节省了 9 次比较。

    这自然是有点简化了,但希望能明白这一点。

    【讨论】:

    • 实际上每个字符两次比较(针对另一个字符串,针对终止字符串的 NUL,或针对计数字符串的长度)。但是 SSE 可以在一次整数比较中执行其中的 16 次比较。
    • @Voigt:忘记了\0 的比较,但是是的,我想我会这样。不想太具体而失去大局。 :)
    【解决方案2】:

    问题在于字符串比较不仅仅是一个单一的比较,它是一个循环中的一个完整序列。如果您比较两个长度均为 10001 个字符且前 9000 个字符相同的字符串,您期望会发生什么?

    BTW SSE 使字符串比较比一次一个字符快很多,但它永远无法达到整数比较的速度。

    【讨论】:

    • ...而 int 比较可以在显着更少的指令中完成。
    【解决方案3】:

    编译器可以优化整数比较,使其直接在 cpu 寄存器内进行。

    【讨论】:

    • 无论如何都会从 RAM 中获取数据(迟早)。并且,使用 CPU 的自动预取进行缓存,在这里可以做得很好。问题在于传输的数据量(已擦除的缓存行)和执行的指令量。
    【解决方案4】:

    模糊地说,字符串比较需要 n 次整数比较,其中 n 是字符串的大小,而整数比较只是一种比较,如果你认为是比率的话。这是比较字符串时可能发生的情况的一个粗略概念!

    显然字符串比较会是一个较慢的过程,因为它是 n 次整数比较(近似)

    【讨论】:

    • strlen+1 是一个上限,当你有一个 SIMD 单元时,需要的比较会更少。不过是 O(N)。
    • 你忘了还有额外的跳转指令,所以不仅要多比较,还要多跳转。
    【解决方案5】:

    整数通常是4-字节。

    字符串介于 1infinity* 字节之间。

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

    【讨论】:

    • 不是,真的,.. 它不仅与字节长度有关,还与比较次数(每个字符分别)和条件跳转次数有关,...没有任何条件跳转的指令。
    猜你喜欢
    • 2012-02-09
    • 1970-01-01
    • 2013-05-06
    • 2013-01-02
    • 1970-01-01
    • 2022-03-30
    • 2020-09-15
    • 2020-02-23
    • 2014-07-13
    相关资源
    最近更新 更多