哪个更快:ldc.i4 / ldstr还是ldloc?

时间:2015-11-05 11:40:10

标签: compiler-construction .net-assembly cil ilasm

我正在为.NET平台编写一个非常基本的编译器,并想知道我的常量实现。

在我的编译器中,使用常量有望取代ldloc操作。

如果常量theAge(18)和Name(Barry)实际上是变量,则IL可能类似于:

ldstr "Your name is "
ldloc theName
concat                 //Example operation for concatenating
ldstr " and you are "
concat
ldloc theAge
tostring               //Example operation for changing the variable to a string
concat

但是如果我实现了常量:

ldstr "Your name is "
ldstr "Barry"
concat
ldstr " and you are "
concat
ldc.i4 18
tostring
concat

哪个更快:ldc.i4 / ldstr还是ldloc?或者将常量存储为变量更好?

1 个答案:

答案 0 :(得分:2)

  1. 我同意@ 500的评论:这是一个微观优化,只有在你的编译器工作之后你才应该担心这个问题。然后,您应该使用基准来确定哪些选项更快,以及多少,性能难以预测。
  2. 如果我试图预测这个(尽管我上面已经发出警告),我会说直接加载常数会更快(如果差异实际上是可测量的)。

    这是因为在ldc选项中,CPU将读取指令,然后可以直接将值写入寄存器。使用ldloc,它还将加载堆栈中的值。 ldstr的情况类似。

    但是如果局部变量中的值实际上是常量,则JIT编译器可以优化ldloc到与ldc相同的代码,因此可能没有任何区别一点都不(但我不知道常见的JIT编译器是否能够做到这一点。)