【问题标题】:Does using binary numbers in code improves performance?在代码中使用二进制数会提高性能吗?
【发布时间】:2012-04-28 02:37:18
【问题描述】:

我见过很多在代码中使用二进制数的例子,比如 32,64,128 等等(例如,非常有名的例子 - minecraft)

我想问一下,在 Java / C++ 等高级语言中使用二进制数有什么帮助吗?

我知道汇编,并且您总是更愿意使用这些,因为在低级语言中,如果您超出寄存器限制,它会使事情变得过于复杂。

如果使用二进制数,程序会运行得更快/节省更多内存吗?

【问题讨论】:

  • 呃,所有数字都是二进制的。
  • 你的意思是二次幂吗?
  • 嗯,呵呵。 PC 16 位架构中有寄存器。如果我没记错的话,一个寄存器最多可以容纳 65535。如果你想添加两个低于这个数字的数字,那是小菜一碟。但是,如果数字高于这些数字,您就会遇到一个大问题,这需要额外的约 200 条装配线。这就是这个问题的全部内容,高级语言如何处理这些情况。 @Makoto 是的,我的意思是二次幂
  • 寄存器在当今的桌面上是 32 位或 64 位的。还是你有一台 16 位的电脑?
  • 您的问题是关于常量的吗?或者关于整数变量的类型/大小?

标签: binary numbers


【解决方案1】:

与大多数事情一样,“这取决于”。

在编译型语言中,较好的编译器会推断出慢速机器指令有时可以用不同的较快机器指令来完成(但仅限于特殊值,例如 2 的幂)。有时编码人员知道这一点并相应地编程。 (例如,乘以 2 的幂很便宜)

其他时候,算法适用于涉及 2 次方的表示(例如,许多分而治之的算法,如快速傅立叶变换或合并排序)。

但在其他时候,它是表示布尔值(如位掩码)的最紧凑的方式。

除此之外,其他时候它对于内存目的效率更高(通常是因为用 2 的幂来乘除逻辑非常快,操作系统/硬件/等将使用缓存行/页面大小等是 2 的幂,所以你最好为你的重要数据结构设置 2 大小的幂)。

然后,除此之外,其他时候.. 程序员只是习惯于使用 2 的幂,以至于他们只是这样做,因为这看起来是一个不错的数字。

【讨论】:

    【解决方案2】:

    使用它们的原因可能不同 - 例如位掩码。

    如果您在数组大小中看到它们,它并没有真正提高性能,但通常内存是按 2 的幂分配的。例如如果你写了char x[100],你可能会得到 128 个分配的字节。

    【讨论】:

    • 这是误导,内存通常与 8 字节区域对齐,但并非总是如此,如果您在数组中使用整数,它已经对齐,因为 int 是全字大小。
    • @drew212 我不是在谈论对齐。
    • 那你到底在说什么?当分配内存并添加填充时,这是由于对齐。大多数当前的 CISC 系统不再受此限制,但对齐内存仍然更快,这就是它完成的原因。您对您所说的内容有参考/来源吗?
    【解决方案3】:

    不,您的代码将以相同的方式运行,无论您使用什么数字。

    如果二进制数是指 2 的幂的数字,例如:2、4、8、16、1024.... 通常由于空间优化,它们很常见。例如,如果你有一个 8 位指针,它能够指向 256(即 2 的幂)地址,所以如果你使用少于 256 的地址,你就是在浪费你的指针......所以通常你分配一个 256 的缓冲区...这同样适用于所有其他 2 数字的幂....

    【讨论】:

    • 小心。我知道在 Android 平台下,我看到我的乘法变成桶式移位,因为它们是 2 的方便幂。
    • 是的,对于计算,这总是正确的......但在高级语言中并不总是关心这个......所以我(个人意见),今天不认为这是一个问题.... 但在过去(或低级语言),这是必须的!但是,无论何时,轮班都是有用的!
    【解决方案4】:

    在程序中使用两个数字的幂有一些好处。位掩码是其中的一种应用,主要是因为位运算符(&|<<>> 等)速度非常快。

    在 C++ 和 Java 中,这是相当多的——尤其是对于 GUI 应用程序。您可以拥有一个包含 32 个不同菜单选项(例如可调整大小、可移动、可编辑等)的字段,并应用每个选项,而无需经过复杂的值相加。

    就原始加速或任何性能改进而言,这实际上取决于应用程序本身。 GUI 包可能巨大,因此在应用菜单/界面选项时从这些包中获得任何加速都是一个巨大的胜利。

    【讨论】:

      【解决方案5】:

      从您的问题的标题看来,您的意思是“如果您以二进制形式编写常量,是否会使您的程序更有效率?”如果这就是你的意思,那么答案肯定是,不。编译器在编译时将所有常量转换为二进制,所以到程序运行时,它没有任何区别。我不知道编译器是否可以比十进制更快地解释二进制常量,但差异肯定是微不足道的。

      但是您的问题的主体似乎表明您的意思是“使用二进制整数的常量”,而不是必须用二进制数字表示它们。

      在大多数情况下,答案是否定的。例如,如果计算机必须将两个数字相加,那么添加一个恰好是二进制整数的数字不会比添加一个非整数数字快。

      乘法可能会稍微快一些。一些编译器足够聪明,可以将乘以 2 的幂转换为位移运算,而不是硬件乘法,并且位移通常比乘法更快。

      在我使用汇编语言的时候,我经常使数组中的元素大小为 2 的幂,因此我可以通过位移而不是乘法来索引数组。但是在高级语言中很难做到,因为你必须做一些研究来找出你的原语在内存中占用了多少空间,编译器是否在它们之间添加了填充字节等等。如果您确实向数组元素添加了一些字节以将其填充为 2 的幂,整个数组现在更大了,因此您可能会产生额外的页面错误,即操作系统耗尽内存并且必须写入块将您的数据存储到硬盘驱动器,然后在需要时将其读回。一个额外的硬盘权利比 1000 次乘法需要更多的时间。

      在实践中,(a) 差异是如此微不足道,几乎不值得担心; (b) 您通常不知道在低级别发生的所有事情,因此通常很难预测具有预期后果的更改是有益还是有害。

      简而言之:不要打扰。使用问题自然的常数值。

      【讨论】:

        【解决方案6】:

        在大多数情况下,答案几乎总是否定的,没有明显的性能差异。

        但是,在某些情况下(非常少),不使用二进制数作为数组/结构大小/长度会带来显着的性能优势。这些是您填充缓存的情况,并且因为您正在循环填充缓存的结构,因此每次循环遍历数组/结构时都会发生缓存冲突。这种情况非常罕见,除非您的代码执行速度比理论上的限制要慢得多,否则不应进行预优化。此外,这种情况非常依赖于硬件,并且会因系统而异。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-04-03
          • 1970-01-01
          • 2013-04-12
          • 1970-01-01
          • 2015-08-02
          相关资源
          最近更新 更多