F#内联函数是否有最大深度?

时间:2014-09-03 06:44:48

标签: performance f# clr inline

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

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

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

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

0 个答案:

没有答案