Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance F#内联函数是否有最大深度?_Performance_F#_Clr_Inline - Fatal编程技术网

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

Performance F#内联函数是否有最大深度?,performance,f#,clr,inline,Performance,F#,Clr,Inline,在一个非常繁忙的内部循环中进行优化时——处理数亿个浮点数——我使用F#的inline非常有效,部分是为了类型泛型,部分是为了性能 通过查看反编译的IL,F#编译器似乎只会内联到特定的深度(可能是3或4?)。如果我手工编写内部循环(两个嵌套的for循环),我将得到一个包含预期内联转换代码的循环。相反,如果我为循环编写一个helper函数,以便可以参数化数据中的字大小,那么循环将包含嵌套的函数调用,即使所有相关函数都标记为inline。这有利于性能下降2倍 我很欣赏inline关键字主要用于静态类型

在一个非常繁忙的内部循环中进行优化时——处理数亿个浮点数——我使用F#的
inline
非常有效,部分是为了类型泛型,部分是为了性能

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

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


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

我想,
inline
并没有达到您预期的效果-并不是说最大内联深度有限制。例如,
^t
约束实际上需要内联,我认为如果内联不起作用,就会出现错误。是的,就像内联一样,但是使用部分应用的函数在检查时不那么明显,如果可以包含一个小的重新设置,那么诊断起来会更容易。