c# - 内联函数的 32 字节限制...不是太小了吗?

标签 c# inline

我有一个非常小的 C# 代码标记为内联,但不起作用。 我发现最长的函数会生成超过 32 个字节的 IL 代码。 32 字节的限制是否太短?

// inlined
[MethodImpl(MethodImplOptions.AggressiveInlining)] 
static public bool INL_IsInRange (this byte pValue, byte pMin) {
  return(pValue>=pMin);
}

// NOT inlined
[MethodImpl(MethodImplOptions.AggressiveInlining)] 
static public bool INL_IsInRange (this byte pValue, byte pMin, byte pMax) {
  return(pValue>=pMin&&pValue<=pMax);
}

是否可以更改该限制?

最佳答案

我也在寻找内联函数标准。就您而言,我认为 JIT 优化在决定内联第二个函数之前就超时了。对于 JIT 来说,内联函数不是优先事项,因此它忙于分析您的长代码。但是,如果您将调用置于紧密循环内,JIT 可能会内联它们,因为内部调用将优先于内联。如果您真的关心这种类型的微优化,那么是时候切换到 C++ 了。这是一个全新的勇敢世界等待您探索和探索!

我注意到这个问题在这个答案发布后就被编辑了,这意味着高度的互动性。好吧,我不知道为什么有 32 字节的限制,但保守地说,这似乎正是 CPU 缓存 block 的大小。真是巧合啊!无论如何,代码优化必须使用特定的硬件配置来完成,最好与其程序集并排保存在额外的文件中。超时策略很愚蠢,因为优化不应该在运行时完成,从而与宝贵的代码执行时间竞争。优化应该在应用程序加载时完成,仅在第一次在计算机上运行时完成,一劳永逸。当检测到硬件配置变化时可以再次触发。再说一次,如果你真的需要性能,就选择 C/C++。 C#不是为性能而设计的,也永远不会把性能放在第一位。与 Java 一样,C# 也是为了安全性而设计的,对可能的负面性能影响更加谨慎。

关于c# - 内联函数的 32 字节限制...不是太小了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41091926/

相关文章:

c# - 将 Google map 包含在 .Net Core 中的正确方法?

c++ - C++ 中对象实例化的方法访问

c# - 检测 WPF ListView 滚动条何时位于底部?

c# - 实现 IE 9's JavaScript engine (“Chakra” 的 IActiveScript 实例,在 Quirks 模式下工作

c# - CLR 中方法表的精确布局(4.0 版)

c# - 静态方法签名类型参数和部分应用

c++ - 透明 C++ 数字/Int 包装器

haskell - 将 Haskell 多态余弦函数转换为 F#

r - 通过 includeMarkdown 包含覆盖内联代码的外部 markdown 文件

c++ - 是否必须在同一个文件中声明 C++ 内联函数?