F#内联函数的最大深度是多少?
在一个非常繁忙的内部循环中进行优化 - 处理数以亿计的浮点数 - 我使用F# inline
以取得良好效果,部分是针对类型通用性,部分针对性能。
通过查看反编译的IL,似乎F#编译器将只内联到特定深度(可能是3或4?)。 如果我手工编写我的内部循环(两个嵌套for
循环),我得到一个内嵌预期转换代码的循环。 相反,如果我为循环编写一个辅助函数,以便可以在数据中对字大小进行参数化,则循环包含嵌套函数调用,即使所有相关函数都标记为inline
。 这对性能下降2倍是很好的。
我很欣赏inline
关键字主要用于静态类型约束,而不是性能增强,但是这种行为令我感到惊讶。 在放弃之前,F#编译器会做什么最大量的工作来生成内联IL? 有没有办法影响这个最大值?
(仔细查看代码,应该争辩说CLR JIT本身应该内联函数,因为它们非常小,主要是一些位移和平等测试,但这完全是另一个话题。)
链接地址: http://www.djcxy.com/p/80659.html上一篇: Is there a maximum depth for F# inlined functions?
下一篇: What is the earliest entrypoint that the CLR calls before calling any method in an assembly?