【发布时间】:2012-11-21 02:12:19
【问题描述】:
F#
[|for index in 1 .. items.Count()-1 -> (* create object here - complex operations *)|]
C#
Object[] newItemArray= new Object[items.Count];
Parallel.For(0, items.Count, index=>
{
/*complex stuff here*/
newItemArray[index] = new Object();
});
我有上面的 C# 和 F# 做同样的事情。如果没有Parallel.For,F# 会稍微快一些。使用Parallel.For,C# 的执行时间减半。如何正确并行化 F# 以获得与 C# 相同的性能提升?
到目前为止,我尝试的方法是 Array.Parallel.Iteri,因此我可以在 C# 中使用的数组技巧中使用相同的索引,但它会减慢而不是加快速度。
编辑:
关于我在做什么的更多细节:
我有一个可枚举的byte array array array。我还有另一个byte array array array,我正在与其他人进行比较。我正在对可枚举的百分比相似度进行排序并返回前 500 个。
在 F# 和 C# 中,我都在做一个简单的嵌套 for 循环,它会增加一个计数器。当循环遍历我的可枚举中的特定项目时,我创建了一个 (item, counter) 的元组。完成创建新的 (item, counter) 可枚举项后,我对 counter 变量进行排序,获取前 500 个,然后转换回仅可枚举的项目。
我放入 Parallel.For 的部分是 IEnumerable<Tuple<item, int>> 的创建
【问题讨论】:
-
我想是时候开始比较IL了...
-
我知道这并不容易,但你能举一个可重现的例子吗?您编辑并没有多大帮助。