对多个布尔值使用数组或位访问是否更快?

时间:2009-02-05 18:12:54

标签: arrays boolean

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

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

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

和, 2)如果此数组表示我在客户端和服务器之间传递的状态,速度应答是否反转? 在阅读问题“How use bit/bit-operator to control object state?

时会想到这个问题

P.S。是的,我可以编写代码来自己测试,但是SO社区不会参与其中!

6 个答案:

答案 0 :(得分:4)

请记住,理论上更快的解决方案不适合缓存行可能比理论上更慢的解决方案慢,这取决于一大堆东西。如果这实际上是需要快速的东西,如分析所确定的那样,测试两种方式并查看。如果没有,那就做一些看起来更干净的代码,这可能是数组。

答案 1 :(得分:3)

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

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

所以这可能是一场胜利,但你需要了解它的优劣背景。 (无论如何,这是一般性的。)

答案 2 :(得分:2)

对于问题#1:是的,在大多数32位平台上,布尔值数组应该更快,因为您只需加载数组中的每个32位对齐值并对其进行测试。如果您使用一个单词,你就可以完成所有这些工作,再加上小工具的开销。

对于问题#2:同样,是的,因为通过网络发送数据要比对CPU和主内存中的数据进行操作要慢得多,发送一个字的开销将大大超过你获得的任何性能增益或损失。对齐单词或位小提琴。

答案 3 :(得分:1)

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

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

这是通过值[index]来测试bool []:

00401000  movzx       eax,byte ptr [ecx+eax]

无法弄清楚如何在其周围放置一个未经优化的循环,我将投票给bool []。

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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

它将提供比使用完整字大小更好的缓存局部性,并且我不认为字节访问在大多数/所有常见体系结构上都比较慢。