在非常繁忙的内循环中进行优化 - 处理数以亿计的浮点数 - 我使用F#的 inline 效果很好,部分用于类型通用性,部分用于性能 .

通过查看反编译的IL,看起来F#编译器只会内联到特定深度(可能是3或4?) . 如果我手动编写内部循环(两个嵌套的 for 循环),我会得到一个内联预期转换代码的循环 . 相反,如果我为循环编写辅助函数,以便我可以对数据中的字大小进行参数化,则循环包含嵌套函数调用,即使所有相关函数都标记为 inline . 这对于性能下降2倍是有利的 .

我很欣赏 inline 关键字主要用于静态类型约束,而不是性能增强,但这种行为让我感到惊讶 . F#编译器在放弃之前生成内联IL会有最大的工作量吗?有没有办法影响这个最大值?

(详细看一下代码,应该说CLR JIT本身应该内联函数,因为它们非常小,主要是一些位移和相等测试,但这完全是另一个主题 . )