C#中基本操作的成本是多少?

时间:2016-05-22 09:17:00

标签: c#

当我实现算法时,我尝试使用尽可能少的操作。

我想知道C#中的基本操作是否是有序的(在速度或成本方面):

  • 比较
  • (u)int add,subtract,bitops,shift
  • 浮点数添加,子(单独的单位!)
  • 索引数组访问(警告:缓存效果)
  • (u)int32 mul
  • FP mul
  • FP部门,余下
  • (u)int division,remainder

2 个答案:

答案 0 :(得分:5)

没有执行“C#操作” - 它被编译(进入MSIL,然后被JIT编译)到机器代码中,这取决于目标体系结构。因此,即使一个操作在一个架构上比另一个操作更快,但在另一个架构上则相反。

无论如何,你所要求的是令人难以置信的低水平。数据结构和算法的选择将会产生数量级的影响,即使你确定了这一点,memory latencies也可能在个别运营中占主导地位。

答案 1 :(得分:1)

正如Branko Dimitrijevic已经指出的那样,C#没有被执行,它被编译为IL。 IL也没有执行,它被编译为机器代码。所以我别无选择,只能将你的问题重新解释为“我的CPU上哪些低级操作更便宜?”。由于有许多架构可供使用,而且你并不具体说明你感兴趣的是哪一个,我将假设x86,因为它是台式机系统中最受欢迎的。

您可以在Intel Architectures Optimization Reference Manual附录C中找到您所询问的信息。此处列出了各种说明的延迟和吞吐量。延迟是指令使其结果准备好供后续指令使用所需的周期数。吞吐量是指令停止执行单元的周期数。一些例子:

  • pod 'CDPieMenu', :podspec => '~/Documents/Project/CDPieMenu.podspec' cmpaddsubandor的延迟为1,吞吐量为0.25。< / LI>
  • xorror的延迟为1到2,吞吐量为0.5到1.5,具体取决于数据的位置。
  • 读取64位寄存器时,
  • rol的延迟为3,吞吐量为1,但读取32位寄存器时,延迟为4到5,吞吐量为1。
  • imul具有可变延迟和吞吐量,具体取决于计算本身。

所以,虽然我没有查询所有您提出的操作,但您建议的列表(按成本的升序排列)似乎至少是合理的。

这一切都假设问题是关于基本操作的成本,仅此而已。但是如果你想实际微观优化一个真正的程序,那就完全不同了。

请注意,在相同的手册中,在时间表进入之前,超过600页描述了在运行的程序的性能中发挥重要作用的众多因素那个架构。这些包括乱序执行引擎,缓存级别,流水线,分支预测,哪个单元运行哪个指令等。

如果您不想获得所有这些问题的工作知识,我认为尝试在该级别进行微观优化并不重要。你会盲目地做。