【发布时间】:2012-02-07 20:47:56
【问题描述】:
我一直在寻找一种使用 .NET 进行适当算法编码的方法,该方法具有现代语言的所有优点(例如,我喜欢强类型检查、运算符重载、lambdas、泛型算法)。通常我用 C++ 编写我的算法(主要是图像处理)。由于 F# 作为一种语言似乎很有趣,所以我玩了一下,但似乎很慢。作为一个最简单的测试,我只是做了一些数组操作 -> 图像的亮度增加:
let r1 = rgbPixels |> Array.map (fun x -> x + byte(10) )
这似乎比比较的 C++ 实现慢至少 8 倍——对于更复杂的算法来说更糟,例如二维卷积。 有没有更快的方法或者我错过了任何特定的编译器设置(是的,构建带有优化的版本......)? 我愿意为好的和高的抽象付费,但这样的开销并不好(我需要在 8 个内核上并行化以补偿:)) - 至少它破坏了进一步学习的动力......我的另一个选择将把我较重的算法留在 C++ 中并与托管 C++ 接口,但这并不好,因为维护托管包装器将是一个相当大的负担。
【问题讨论】:
-
它可能会被内联,但您可以先用
10uy替换对byte的调用。 -
您能否在ideone 上发布您的 C++ 实现,以便我们可以使用?
-
these results 是否与您的相媲美?
-
我引用的 C++ 代码也来自我一段时间前写的代码项目文章:codeproject.com/Articles/216143/… 简而言之:在 C++ 中,我编写了某种遍历原始图像数据数组的迭代器 -非常简单:就像在 F# 中一样遍历所有元素...
-
@Daniel,是的。如果我用相同数量的像素(2000x3000 24Bit jpg)替换 10000 的数量,我会得到完全相同的结果(342 毫秒) - 与你的示例相同,我接近 0 毫秒