【问题标题】:Is it faster to use an array or bit access for multiple boolean values?对多个布尔值使用数组或位访问是否更快?
【发布时间】:2010-10-05 18:03:32
【问题描述】:

1) 在 32 位 CPU 上,访问由 32 个布尔值组成的数组还是访问一个字中的 32 位更快? (假设我们要检查第 N 个元素的值,可以使用位掩码(设置第 N 位)或整数 N 作为数组索引。)

在我看来,数组会更快,因为所有常见的计算机架构本身都在字级别(32 位、64 位等,并行处理)工作,并且访问子字位需要额外的工作。

我知道不同的编译器会以不同的方式表示事物,但似乎底层硬件架构会决定答案。还是答案取决于语言和编译器?

而且, 2)如果这个数组代表我在客户端和服务器之间传递的状态,速度答案是否会反转? 阅读问题“How use bit/bit-operator to control object state?”时想到了这个问题

附:是的,我可以自己编写代码来测试这个,但是 SO 社区就不能一起玩了!

【问题讨论】:

  • 布尔值不必是 32 位,正如您在您的问题中所指出的那样。大小由实现定义。
  • 布尔大小取决于编译器的实现。

标签: arrays boolean


【解决方案1】:

如果您要一次检查多个值,并行执行显然会更快。如果你只检查一个值,它可能是相同的。

如果您需要比这更好的答案,请编写一些测试并与我们联系。

【讨论】:

    【解决方案2】:

    对于问题 #1:是的,在大多数 32 位平台上,布尔值数组应该更快,因为您只需加载数组中的每个 32 位对齐值并针对 0 进行测试。如果您使用一个单词,您将完成所有工作以及摆弄比特的开销。

    对于问题 #2:同样,是的,因为通过网络发送数据比处理 CPU 和主内存中的数据慢得多,发送一个字的开销将大大超过您获得的任何性能增益或损失对齐单词或摆弄。

    【讨论】:

      【解决方案3】:

      请记住,理论上较快但不适合缓存行的解决方案可能比理论上较慢的解决方案要慢,这取决于很多事情。如果这实际上是需要快速的东西,由分析确定,测试两种方式并查看。如果没有,请执行任何看起来更简洁的代码,这可能是数组。

      【讨论】:

      • 是的。处理器缓存交换在这里很重要。此外,时间片可能会使您的“测试”变得非常糟糕。一定要小心!
      【解决方案4】:

      这是由 0 != (value & (1

      00401000  mov         eax,1 
      00401005  shl         eax,cl 
      00401007  and         eax,1 
      

      这可以通过 values[index] 来测试一个 bool[]:

      00401000  movzx       eax,byte ptr [ecx+eax]
      

      不知道如何在它周围放置一个没有得到优化的循环,我会投票 bool[]。

      【讨论】:

        【解决方案5】:

        这取决于编译器、访问模式和平台。 Raymond Chen 有出色的成本效益分析:http://blogs.msdn.com/oldnewthing/archive/2008/11/26/9143050.aspx

        即使在非 x86 平台上,位的使用也可能令人望而却步,因为至少有一个 PPC 平台使用微编码指令来执行可变移位,这可能会与其他硬件线程一起做讨厌的事情。

        所以这可能是一场胜利,但你需要了解它的好与坏的背景。 (无论如何,这是一个普遍的事情。)

        【讨论】:

        • +1 我正要搜索这个博客条目,但你帮我做了。
        【解决方案6】:

        对于简单的随机访问,我认为字节数组可能比全字数组更好。

        与使用完整字长相比,它会提供更好的缓存局部性,而且我不认为字节访问在大多数/所有常见架构上都会变慢。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-16
          • 2017-03-06
          • 2015-05-23
          • 1970-01-01
          • 2018-08-01
          相关资源
          最近更新 更多