c++ - 在 C/C++ 中乘以小数(相对于高数)是否更快?

标签 c++ c optimization integer-arithmetic

问题示例:

计算 123 * 456 比计算 123456 * 7890 快吗?还是速度一样?

我想知道 32 位无符号整数,但我不会忽略有关其他类型(64 位、有符号、浮点等)的答案。如果不同,那么差异的原因是什么?位是否为0/1?

编辑:如果有什么不同,我应该澄清我指的是任何数字(两个低于 100 的随机数与两个高于 1000 的随机数)

最佳答案

对于至少达到架构字大小的内置类型(例如,现代 PC 上的 64 位,过去几十年来大多数低成本通用 CPU 上的 32 或 16 位),对于每个编译器/实现/版本和我听说过的 CPU,用于乘法特定整数大小的 CPU 操作码需要一定数量的时钟周期,而与涉及的数量无关。不同大小的数据相乘在某些 CPU 上的性能不同(例如,AMD K7 对于 16 位 IMUL 有 3 个周期延迟,而对于 32 位则有 4 个周期延迟)。

某些架构和编译器/标志组合上,有可能出现类似 long long int 的类型其位数多于 CPU 操作码在一条指令中可以操作的位数,因此编译器可能会发出代码来分阶段执行乘法,这将比 CPU 支持的类型的乘法慢。但同样,在运行时以更广泛的类型存储的小值不太可能与较大的值有任何不同的处理或执行。

总而言之,如果一个或两个值都是编译时常量,则编译器能够避免 CPU 乘法运算符,并针对某些值优化为加法或移位运算符(例如 1 显然是一个无操作) ,任一侧 0 ==> 0 结果, * 4 有时可以实现为 << 2 )。没有什么特别的阻止技术,例如将位移位用于较大的数字,但较小比例的此类数字可以优化到相同程度(例如,有更多的 2 的幂 - 可以使用位移位左移来执行乘法 - 0 到 1000 之间比 1000 到 2000 之间)。

关于c++ - 在 C/C++ 中乘以小数(相对于高数)是否更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49167058/

相关文章:

c++ - 如何使用boost使用shared_ptr成员序列化对象

C time.h环绕

c++ - 关于STL内部结构的问题

c++ - C 和 C++ 的优化工具

c++ - 现代 C/C++ 编译器能否更好地优化 header 中的代码?

c++ - 将单词拆分为两个字节的最快方法

c++ - 如何在 C++ 中从类更改为结构?

c++ - C/C++ 后置递增不止 1

c - 同时执行 2 个不同的函数,pthread 是我的答案吗?

c - 解密 x86 汇编函数