0

我正在为 .NET 平台编写一个非常基本的编译器,并且想了解一些关于我的常量实现的信息。

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

如果常量 theAge(18) 和 theName(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?还是将常量存储为变量更好?

4

1 回答 1

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

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

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

于 2015-11-05T13:19:48.707 回答