Compiler construction 哪个更快:ldc.i4/ldstr还是ldloc?
我正在为.NET平台编写一个非常基本的编译器,我想知道一些关于常量实现的知识 在我的编译器中,常量的使用有望取代ldloc操作 如果常数theAge(18)和theName(Barry)实际上是变量,则IL可能类似于: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
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?还是将常量存储为变量更好
ldc
选项中,CPU将读取指令,然后可以直接将值写入寄存器。使用ldloc
,它还将从堆栈中加载值。ldstr
的情况类似
但是,如果局部变量中的值实际上是常量,JIT编译器可以将ldloc
优化为与ldc
相同的代码,因此可能根本没有任何差异。(但我不知道普通的JIT编译器是否可以做到这一点。)IMHO说,在最初的开发过程中担心这些细节还为时过早。一旦你有了一个在各个方面都能正常工作的编译器,你就可以回去试验替代的代码生成序列,如果你认为它们是合理的,你就可以进行更改。嗯,你跳过了一些重要的东西,在你可以使用LDLOC之前,你必须先初始化变量。也许是LDSTR。MSIL和实际在处理器上运行的机器代码之间只有一个薄弱环节,但一个非常基本的粗略衡量标准是,MSIL越多,执行时间就越长。如果该变量实际上是用LDSTR初始化的,那么这无关紧要,抖动优化器会将其删除。