Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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
Performance 访问一个字节比访问一个位快吗?为什么?_Performance_Byte_Bit - Fatal编程技术网

Performance 访问一个字节比访问一个位快吗?为什么?

Performance 访问一个字节比访问一个位快吗?为什么?,performance,byte,bit,Performance,Byte,Bit,问题很简单:访问一个字节是否比访问一个字节快?如果我在一个字节中存储8个布尔值,当我必须比较它们时,会比使用8个字节慢吗?为什么?不太可能。今天大多数机器中最小的可寻址内存单元是一个字节。在大多数情况下,您不能按位寻址或访问 事实上,访问特定位可能更昂贵,因为您必须构建一个掩码并使用一些逻辑 编辑: 你的问题提到“比较”,我不确定你的确切意思。但在某些情况下,如果布尔密集地压缩为较大的整数类型,则可以使用位运算符对多个布尔非常有效地执行逻辑 至于使用哪一种:字节数组(每个字节一个布尔值),或者一

问题很简单:访问一个字节是否比访问一个字节快?如果我在一个字节中存储8个布尔值,当我必须比较它们时,会比使用8个字节慢吗?为什么?

不太可能。今天大多数机器中最小的可寻址内存单元是一个字节。在大多数情况下,您不能按位寻址或访问

事实上,访问特定位可能更昂贵,因为您必须构建一个掩码并使用一些逻辑

编辑:

你的问题提到“比较”,我不确定你的确切意思。但在某些情况下,如果布尔密集地压缩为较大的整数类型,则可以使用位运算符对多个布尔非常有效地执行逻辑


至于使用哪一种:字节数组(每个字节一个布尔值),或者一个每比特一个布尔值的密集结构是一种空间效率权衡。对于一些需要存储大量布尔值的应用程序,密集打包更好,因为它可以节省内存。

代码运行的底层硬件是为了从内存中访问字节(或更长的字)。要读取一个位,您必须读取整个字节,然后屏蔽掉您不关心的位,并且可能还要进行移位以将该位移到“1”的位置。因此,访问位的指令是访问字节的指令的超集。

如果您需要遍历和访问一行中的多个8位标志集,则将数据存储为位可能会更快。您将对每个布尔标志执行更多操作,但通过将其压缩在更少的字节中,您将遍历更少的内存。您还可以在一个操作中测试多个标志,尽管在某种程度上,您也可以使用bool来测试多个标志,只要它们位于一个机器字内


内存延迟惩罚远远高于寄存器位旋转。最后,只有在它实际运行的硬件上分析代码,才能告诉您哪种方式最好。

计算机倾向于用文字访问东西。访问bit的速度较慢,因为它需要更多的努力:

想象一下我对你说了什么,然后说“哦,把我的第二个词改成”。 现在想象一下,我的编辑是“哦,把第二个单词中的第三个字母改成‘s’”


从硬件的角度来看,我想说的是,一般来说,在最好的情况下,所有位屏蔽和其他操作都可能发生在一个时钟内(结果没有什么不同),但这完全取决于硬件层,而您可能永远都不知道其具体情况,因此,你不能指望它

值得指出的是,像.NET
system.collections.bitarray
这样的东西在下面使用一个32位整数数组来存储它的位数据。这一实现背后可能有一个性能原因(即使只是在32位字的性能高于平均值的一般情况下),我建议阅读可能会有所启示的内部工作原理

从编码的角度来看,这真的取决于您以后将如何处理这些位。也就是说,如果要将数据存储在布尔值中,例如:

bool a0, a1, a2, a3, a4, a5, a6, a7;
然后在您的代码中逐一比较它们(并且将大多数放在一起):

然后您会发现使用位掩码会更快(而且代码可能更整洁)。但真正重要的是,如果要在高性能或时间关键型环境中运行此代码数百万次

我猜我在这里得到的是,你应该按照你的编码标准去做(如果你没有任何的,或者他们不考虑这些细节,那么就去做看起来最适合你的应用程序和需要的东西)。
但我强烈建议大家四处看看,读一两篇博客,解释.NET
system.collections.bitarray的内部工作原理。这取决于处理器和主板数据总线的类型,也就是说,如果将数据收集到“word”而不是“bool”或“byte”中,32位数据总线将更快地比较数据。。。。
这只有在您使用汇编语言编写时才有效,因为您可以比较每条指令需要多少个周期。。。。但由于您使用的是编译器,所以它几乎是相同的。

然而,将布尔值收集成字或整数将有助于节省变量所需的内存。

这是一种疯狂的微观优化。如果你在一个项目中工作,你真的需要担心字节与比特的性能(这在非常真实的情况下可能是合法的,但在专门的软件中只是很小的一部分),那么你可能应该编写一个汇编程序,你和处理器之间绝对没有任何关系。仅供参考,访问处理器字可能比访问字节或位更快。例如(对于许多处理器)32位数值。一次访问的最快数据块取决于您所说的是缓存中、内存中、磁盘外、线外等等。还有很多因素比这更重要。所问的问题非常广泛,几乎和计算机科学一样广泛…@MerlynMorgan-Graham。我想补充一点,您的问题无法得到明确的回答,因为根据硬件、用途和实用性的不同,操作的优化也不同。@normalocity不,不是。首先,是教育。这从来都不是坏事。第二,如果他们想优化任何一种在这个层次上处理信息的算法,这是一个重要的问题。不管使用哪种语言(顺便说一句,他们没有具体说明)。不管你在做什么,停止它。除非你正在做一个纳秒级差异很重要的项目(这不太可能),否则你不需要问这个问题。过早的优化是不好的。我还要补充一点,假设字节访问比位访问快是安全的,因为假设相反的情况可能会发生
if ( a0 && a1 && !a2 && a3 && !a4 && (!a5 || a6) || a7) {
...
}