我缺少重要的优化,因为 JIT 不会内联我的很多方法。
例如让我们有以下代码:
static void Main(string[] args)
{
IsControl('\0');
}
public static bool IsControl(char c)
{
return ((c >= 0 && c <= 31) || (c >= 127 && c <= 159));
}
JIT 编译后生成以下内容:
0000001f xor ecx,ecx
00000021 call FFFFFFFFFFEC9760
00000026 mov byte ptr [rsp+20h],al
0000002a nop
0000002b jmp 000000000000002D
0000002d add rsp,38h
00000031 rep ret
请注意,0000001f
是我设置断点的位置。如您所见,00000021
处有一个调用,这是绝对错误的。为什么这么小的方法不适合内联?请注意,这是在优化的情况下编译的。
最佳答案
除了使用提前源代码或字节码转换在指令到达 JIT 之前内联指令外,没有办法要求 JIT 编译器内联您的方法。
如果您的算法对微优化非常敏感,以至于删除调用指令会带来显着的性能优势,那么您可以考虑用另一种语言重写代码的性能关键部分,以提供更广泛的工具来控制该行为。根据您问题的措辞,您似乎正试图将 C# 强加到它旨在完全避免的问题空间中。
关于c# - JIT 拒绝内联微型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23850026/