我们可以比较二元运算符的 benchmark/performance 吗?

Can we compare benchmark/performance of binary operators?

我的问题是关于二元运算符的性能(执行时间/基准),我们可以举例说明执行 a + ba % b 快吗? 我的问题不仅限于那些运算符(+ 和 %),还包括:

这些运算符的性能取决于平台。如果用“慢”运算符表示的操作可以用“快速”运算符实现,您通常可以期望编译器选择它并发出快速代码。不要仅仅因为有人告诉你他们更快而没有基准测试就使用“更快”的操作数。

不过一般来说,算子的速度大致可以按照以下的尺度来分类:

  1. 零循环:紧接在取消引用之前的加法,例如在数组表达式 a[b] 中,通常是免费的。一元 + 也是免费的。
  2. 一个周期:对于整数操作数:二进制+-<<>>&|^、一元 -~、整数类型或指针之间的转换,如果结果不以数字形式使用:!<> , <=, >=, !=, &&, ||
  3. 三到四个周期:整数操作数上的二进制 *,浮点操作数上的:二进制 +-
  4. 20 个周期 (?):整数二进制 /%
  5. 50 个周期 (?): 浮点数 /, fmod

您的里程可能会有所不同,请勿依赖此 table,如有疑问,请使用基准。

FUZxxl 回答的一些补充:

  • 在现代英特尔和 AMD 上,+ 和 * 具有大致相同(非常快)的吞吐量,但 * 通常具有更高的延迟。吞吐量是您发出命令的频率,而延迟是您在结果准备好之前必须等待的时间(而 CPU 执行其他无序的事情)
  • 一些 RISC CPUs 有相当昂贵的班次(即在 Xbox360 和 PS3 上使用的班次)
  • 他们 "fixed" 前段时间的师,它不再像以前那样慢得可怕。我认为 FP 划分现在大约是 16 个时钟(整数实际上可能更慢)
  • 虽然比较本身都很快,但如果预测错误,条件跳转可能会非常慢(因为 CPU 将不得不转储它会提前预测执行的所有内容)。 CPU 是否设法预测比较结果取决于它们的随机性(当多次执行相同的检查时)。然而,即使它们倾向于遵循一种模式,每次跳跃都会占用一个分支预测槽,因此它可能会从中驱逐另一个跳跃,而另一个分支将遭受错误预测的惩罚。换句话说,比较可能非常昂贵。