c# - JIT 拒绝内联微型方法

标签 c# .net optimization inline jit

我缺少重要的优化,因为 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/

相关文章:

c++ - 我应该在哪里声明一个涉及多次实例化的类的枚举类?

mysql - Laravel Web 应用程序的可扩展性

c# - 无法以不同用户身份运行 C# 进程

python - 如何优化 Python 程序

c# - 检查 url 是否在域名后有任何内容

c# - 检查两个 List<T> 是否相等的最快方法

c# - float.Parse 返回不正确的值

c# - 如何使用 MEF Inherited Export & MetaData?

c# - 如何将时间设置为当天的午夜?

c# - 如何故意让代码路径不在 C# 中返回 int 值