Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 对多个布尔值使用数组或位访问是否更快?_Arrays_Boolean - Fatal编程技术网

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

Arrays 对多个布尔值使用数组或位访问是否更快?,arrays,boolean,Arrays,Boolean,1) 在32位CPU上,访问32个布尔值的数组或在一个字内访问32位更快吗?(假设我们要检查第N个元素的值,并且可以使用位掩码(设置了第N位)或整数N作为数组索引。) 在我看来,阵列会更快,因为所有常见的计算机体系结构都在字级(32位、64位等,并行处理)工作,访问子字位需要额外的工作 我知道不同的编译器将以不同的方式表示事物,但似乎底层硬件架构将决定答案。或者答案取决于语言和编译器 以及, 2) 如果此数组表示在客户端和服务器之间传递的状态,则速度回答是否相反? 阅读问题“”时,我想到了这个问

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

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

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

以及, 2) 如果此数组表示在客户端和服务器之间传递的状态,则速度回答是否相反? 阅读问题“”时,我想到了这个问题


另外,是的,我可以自己编写代码来测试,但这样一来,SO社区就无法合作了

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


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

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

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

对于问题1:是的,在大多数32位平台上,布尔值数组应该更快,因为您只需加载数组中每个32位对齐的值并针对0进行测试。如果你只使用一个单词,那么你就有了所有的工作,再加上一点拨弄的开销

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

对于问题#1:是的,在大多数32位平台上,布尔值数组应该更快,因为您只需加载数组中的每个32位对齐值,并根据0对其进行测试。如果你只使用一个单词,那么你就有了所有的工作,再加上一点拨弄的开销


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

请记住,理论上更快的解决方案如果不适合缓存线,可能会比理论上更慢的解决方案慢,这取决于整个主机。如果这确实是需要快速完成的事情(由分析确定),请测试两种方法并查看。如果没有,则执行看起来更干净的代码,这可能就是数组。

请记住,理论上更快的、不适合缓存线的解决方案可能比理论上更慢的解决方案慢,这取决于整个主机。如果这确实是需要快速完成的事情(由分析确定),请测试两种方法并查看。如果没有,则执行看起来更干净的代码,这可能就是数组。

这是由0生成的代码!=(value&(1这是由0生成的代码!=(value&(1这取决于编译器、访问模式和平台。Raymond Chen有一个出色的成本效益分析:

即使在非x86平台上,位的使用也可能是禁止的,因为至少有一个PPC平台使用微代码指令来执行可变移位,这可能会对其他硬件线程造成麻烦


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

这取决于编译器、访问模式和平台。Raymond Chen有一个出色的成本效益分析:

即使在非x86平台上,位的使用也可能是禁止的,因为至少有一个PPC平台使用微代码指令来执行可变移位,这可能会对其他硬件线程造成麻烦


因此,这可能是一个胜利,但你需要了解它的好坏(这是一个普遍的事情。)

对于简单的随机访问,字节数组可能比完整的单词数组更好


与使用全字大小相比,它将提供更好的缓存位置,并且我不认为在大多数/所有常见的体系结构上,字节访问速度会更慢。

对于简单的随机访问,字节数组可能比全字数组好


它将提供比使用全字大小更好的缓存位置,并且我不认为在大多数/所有常见的体系结构上字节访问速度更慢。

+1我正要搜索这个博客条目,但你为我做了。+1我正要搜索这个博客条目,但你为我做了。是的。处理器缓存交换在这里是一个大问题。还有,时间licing会把你的“测试”搞得一团糟。必须小心!是的。处理器缓存交换在这里是一件大事。而且,timelicing会把你的“测试”搞得一团糟非常糟糕。必须小心!布尔值不必像你在问题中指出的那样大小为32位。大小由实现定义。布尔值大小取决于编译器实现。布尔值不必像你在问题中指出的那样大小为32位。大小由实现定义。布尔值大小取决于编译器实现。
00401000  mov         eax,1 
00401005  shl         eax,cl 
00401007  and         eax,1 
00401000  movzx       eax,byte ptr [ecx+eax]