在JIT/AOT编译期间,CIL ldstr是否被替换为对string.Intern的常量引用?

aer*_*son 5 c# string il cil

假设我有一个需要优化但同时易于调试的代码.因此,我会为我使用的每个值分配一个字符串.该字符串是否会造成重大性能损失,或者它是否变成了一个从string.Intern在JIT/ AOTcompilation中获得的常量引用,从而变成一条简单的指令?

例:

在IL中它会是ldstr "gazilion lines".

它是在JIT/AOT编译期间变成类似的东西ldsflda string.InternCache.ID_0000647516166 并被const string ID_0000647516166 = "gazilion lines"; 添加到string.InternCache

是的,我理论上可以查看https://github.com/mono/mono但我不知道如何找到它.

是的,我正在混合使用CIL,C#以及编译的CIL,但是你明白了.

ldstr保证是O(1)

是的,它是CLR的"实现细节",但如果以这种方式进行优化,那将是有意义的.

aer*_*son 1

\n

长答案:是的。在运行时成为单个 MOV reg,imm 指令,\n 请务必使用可以向您显示反汇编结果的调试器,这样您\n 就不必担心元数据令牌和抖动的工作原理。\n \xe2 \x80\x93汉斯·帕桑特

\n
\n