我正在为.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?或者将常量存储为变量更好?
答案 0 :(得分:2)
如果我试图预测这个(尽管我上面已经发出警告),我会说直接加载常数会更快(如果差异实际上是可测量的)。
这是因为在ldc
选项中,CPU将读取指令,然后可以直接将值写入寄存器。使用ldloc
,它还将加载堆栈中的值。 ldstr
的情况类似。
但是如果局部变量中的值实际上是常量,则JIT编译器可以优化ldloc
到与ldc
相同的代码,因此可能没有任何区别一点都不(但我不知道常见的JIT编译器是否能够做到这一点。)