我们可以比较二元运算符的基准/性能吗?

时间:2015-12-22 23:54:53

标签: c algorithm performance benchmarking

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

  • 加法运算符(+和 - )
  • 乘法运算符(*,/,%...)
  • 比较运算符(<,>,< = ...)
  • BITWISE和移位运算符(<<<<<<< ...)
  • ...

2 个答案:

答案 0 :(得分:3)

FUZxxl回答的几个补充:

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

答案 1 :(得分:2)

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

一般来说,运营商可以按照以下比例大致分类:

  1. 零周期:在数组表达式a[b]之前的解除引用之前的加法通常是免费的。一元+也是免费的。
  2. 一个周期:对于整数操作数:二进制+-<<>>&|,{{1 },一元^-,在整数类型或指针之间进行转换,如果结果未以数字方式使用:~!<,{ {1}},><=>=!=
  3. 三到四个周期:整数操作数上的二进制&&,浮点操作数:二进制||*
  4. 20个周期(?):整数二进制+-
  5. 50个周期(?):浮点/%
  6. 您的里程可能会有所不同,不要依赖此表,基准时会有疑问。