c – F#代码优化还是真的那么慢?
我正在寻找一种方法,使用.NET进行适当的算法编码,具有现代语言的所有优点(例如,我喜欢强类型检查,运算符重载,lambda,泛型算法).通常我在C中编写我的算法(主要是图像处理).由于F#作为一种语言似乎很有趣,我玩了一下,但似乎很慢.作为一个最简单的测试我只做了一些数组操作 – >图像亮度增加:
let r1 = rgbPixels |> Array.map (fun x -> x + byte(10) ) 它似乎是比对比C实现慢至少8倍的因素 – 对于更复杂的算法来说更糟糕,例如2D卷积. 解决方法
如果你担心性能,要记住的一个重要事项是默认情况下F#不会改变任何东西.这需要复制许多天真的算法实现,例如您描述的算法.
编辑:我不知道为什么,但以下代码的简单测试为Array.map提供了较差的结果.请务必分析在执行这些优化时尝试的任何算法.但是我和for之间的结果非常相似. Array.map为操作结果创建一个新数组,而不是Array.iteri. rgbPixels |> Array.iteri (fun i x -> rgbPixels.[i] <- x + 10uy) 请注意,这可以包含在您自己的模块中,如下所示 module ArrayM = let map f a = a |> Array.iteri (fun i x -> a.[i] <- f x) 不幸的是,这是一个必要的恶,因为函数式编程的主要租户之一就是坚持不可变对象,就像算法允许的那样,然后一旦完成,就转换为性能至关重要的突变.如果你知道你的表现从一开始就很重要,你需要从这些帮助者开始. 还要注意,可能有一个库提供了这个功能,我只是不知道它在手边. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |