在非常繁忙的内循环中进行优化 - 处理数亿个浮点数 - 我使用F#' s inline
效果很好,部分原因在于类型通用性,部分用于性能。
通过查看反编译的IL,看起来F#编译器只会内联到特定深度(可能是3或4?)。如果我手动编写内部循环(两个嵌套的for
循环),我会得到一个内联预期转换代码的循环。相反,如果我为循环编写一个辅助函数,以便我可以对数据中的字大小进行参数化,则循环包含嵌套函数调用,即使所有相关函数都标记为inline
。这对于性能下降2倍是好的。
我很欣赏inline
关键字主要用于静态类型约束,而不是性能增强,但这种行为让我感到惊讶。 F#编译器在放弃之前生成内联IL会有最大的工作量吗?有没有办法影响这个最大值?
(详细看一下代码,人们应该争辩说CLR JIT本身应该内联函数,因为它们非常小,主要是一些位移和相等测试,但这完全是另一个主题。)