1

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

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

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

并且,2)如果这个数组代表我在客户端和服务器之间传递的状态,速度答案是否会反转?阅读问题“如何使用位/位运算符控制对象状态? ”时想到了这个问题

PS 是的,我可以自己编写代码来测试它,但是 SO 社区将无法参与其中!

4

6 回答 6

4

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

于 2009-02-05T18:35:21.947 回答
3

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

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

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

于 2009-02-05T18:54:07.447 回答
2

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

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

于 2009-02-05T18:19:55.550 回答
1

这是由 0 != (value & (1 << index)) 生成的代码来测试一下:

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

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

00401000  movzx       eax,byte ptr [ecx+eax]

无法弄清楚如何在它周围放置一个没有得到优化的循环,我会投票 bool[]。

于 2009-02-05T18:51:11.103 回答
0

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

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

于 2009-02-05T18:18:54.587 回答
0

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

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

于 2011-11-16T13:22:56.103 回答