访问字节比一点快吗?为什么?

时间:2011-10-16 03:08:04

标签: performance byte bit

问题非常简单:访问字节的速度是否最快?如果我在一个字节中存储8个布尔值,那么当我必须比较它时,它比我使用8个字节要慢吗?为什么呢?

6 个答案:

答案 0 :(得分:4)

机会不是。今天大多数机器中最小的可寻址存储单元是一个字节。在大多数情况下,您无法通过位进行寻址或访问。

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

编辑:

你的问题提到“比较”,我不确定你到底是什么意思。但在某些情况下,如果你的布尔值被密集地打包成更大的整数类型,你可以使用按位运算符在多个布尔值上非常有效地执行逻辑。

至于使用哪个:字节数组(每个字节有一个布尔值),或者每位有一个布尔值的密集压缩结构是空间效率权衡。对于一些需要储存大量硼酸盐的应用,密集包装更好,因为它可以节省内存。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

由于不同的原因,将数据存储为位可能会更快 - 如果您需要遍历并访问一行中的许多8位标志集。您将为每个布尔标志执行更多操作,但是您将通过将其打包在更少的字节中来遍历更少的内存。您也可以在一次操作中测试多个标志,尽管您也可以在某种程度上使用bool执行此操作,只要它们位于一个机器字内即可。

内存延迟惩罚远高于寄存器位twiddling。最后,只对实际运行的硬件上的代码进行分析,这将告诉您哪种方式最佳。

答案 3 :(得分:1)

从硬件的角度来看,我会说一般情况下所有位掩码和其他操作在最佳情况下可能会在一个时钟内发生(导致没有不同),但这完全取决于您可能的硬件层我永远不会知道具体情况,因此你无法依赖它。

值得注意的是,.NET system.collections.bitarray之类的东西使用下面的32位整数数组来存储它的位数据。这种实现背后可能存在性能原因(即使只是在一般情况下32位字的性能高于平均水平),我建议阅读一下可能揭示的内部工作原理。

从编码的角度来看,这实际上取决于你之后要对这些位做些什么。也就是说,如果您要将数据存储在布尔值中,例如:

bool a0, a1, a2, a3, a4, a5, a6, a7;

然后在你的代码中逐一比较它们(大多数都在一起):

if ( a0 && a1 && !a2 && a3 && !a4 && (!a5 || a6) || a7) {
...
}

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

我想我在这里得到的是你应该做你的编码标准所说的任何事情(如果你没有,或者他们不考虑这些细节,那么就做你看来最适合你的应用和需要的东西)。

但我强烈建议您四处寻找并阅读一两个博客,解释.NET system.collections.bitarray的内部运作。

答案 4 :(得分:1)

这取决于处理器和主板数据总线的类型,即如果你把它们收集到" word"而不是" bool" s,32位数据总线会更快地比较你的数据或"字节" s .... 这只有在你用汇编语言编写时才有效,你可以比较每个指令需要多少个循环....但是由于你使用的是编译器,它几乎是相同的。 但是,将布尔值收集为单词或整数将有助于节省变量所需的内存。

答案 5 :(得分:0)

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

想象一下,我对你说了些什么,然后说“哦,改变我的第二个词”。 现在想象我的编辑是“哦,将第二个单词中的第三个字母改为's'。”

您需要更多的思考吗?