我用VS2010分析了一些F#代码,并且分析器显示大约20%的时间花在了'JIT_ChkCastAny'上,但是没有指出这个问题。一点代码。F#分析和JIT_ChkCastAny
有谁知道F#中有什么东西编译成调用这个方法的东西?
更新:通过评论大块的代码,我已经缩小到下列方法: Array.sumBy,Array.averageBy,Array.minBy和Array.maxBy。在每种情况下,数字类型参数都是双倍的,那为什么编译后的代码很慢呢?
我用VS2010分析了一些F#代码,并且分析器显示大约20%的时间花在了'JIT_ChkCastAny'上,但是没有指出这个问题。一点代码。F#分析和JIT_ChkCastAny
有谁知道F#中有什么东西编译成调用这个方法的东西?
更新:通过评论大块的代码,我已经缩小到下列方法: Array.sumBy,Array.averageBy,Array.minBy和Array.maxBy。在每种情况下,数字类型参数都是双倍的,那为什么编译后的代码很慢呢?
这里是Array.sum
在array.fs实施办法(Array.sumBy
类似):
let inline sum (array: (^T)[]) : ^T =
checkNonNull "array" array
let mutable acc = LanguagePrimitives.GenericZero< (^T) >
for i = 0 to array.Length - 1 do
acc <- Checked.(+) acc array.[i]
acc
它使用Checked.(+)
运营商里面有很多开销。如果您想知道,在prim-types.fs
中使用
。并且Checked.(+)
的实现使用了反射
JIT_ChkCastAny
术语可能来自使用此Checked
模块。
我做了以下的测量Array.sum
和使用Array.fold
总和的实现之间进行比较:
#time "on";;
let arr = [|for i in 1..10000000 -> float i|];;
arr |> Array.sum;;
arr |> Array.fold (+) 0.;;
第二个版本的确是一个幅度比第一个快。因此,如果Array.sum
不能满足您的要求,您可以使用自己的sum
实现。
如果没有代码片段或者您所描述的屏幕截图,说什么都太难了? – pad
如果您想要提高代码性能方面的一些帮助,请发布代码片段来说明问题。 – pad