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

Compiler construction 哪个更快:ldc.i4/ldstr还是ldloc?,compiler-construction,.net-assembly,cil,ilasm,Compiler Construction,.net Assembly,Cil,Ilasm,我正在为.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 t

我正在为.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?还是将常量存储为变量更好

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

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

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


  • IMHO说,在最初的开发过程中担心这些细节还为时过早。一旦你有了一个在各个方面都能正常工作的编译器,你就可以回去试验替代的代码生成序列,如果你认为它们是合理的,你就可以进行更改。嗯,你跳过了一些重要的东西,在你可以使用LDLOC之前,你必须先初始化变量。也许是LDSTR。MSIL和实际在处理器上运行的机器代码之间只有一个薄弱环节,但一个非常基本的粗略衡量标准是,MSIL越多,执行时间就越长。如果该变量实际上是用LDSTR初始化的,那么这无关紧要,抖动优化器会将其删除。