F# 并行化阵列创建
F# C#F# 并行化阵列创建,f#,array-initialization,F#,Array Initialization,F# C# Object[]newItemArray=新对象[items.Count]; Parallel.For(0,items.Count,index=> { /*这里有复杂的东西*/ newItemArray[索引]=新对象(); }); 我让上面的C和F做同样的事情。没有并行的。对于,F#稍微快一点。与并行。对于而言,C#需要一半的时间来执行。如何正确地将F并行化以获得与C相同的性能提升 到目前为止,我尝试的方法是Array.Parallel.Iteri,因此我可以将相同的索引用于我在
Object[]newItemArray=新对象[items.Count];
Parallel.For(0,items.Count,index=>
{
/*这里有复杂的东西*/
newItemArray[索引]=新对象();
});
我让上面的C和F做同样的事情。没有并行的。对于,F#稍微快一点。与并行。对于
而言,C#需要一半的时间来执行。如何正确地将F并行化以获得与C相同的性能提升
到目前为止,我尝试的方法是Array.Parallel.Iteri
,因此我可以将相同的索引用于我在C#中使用的数组技巧,但它使它变慢而不是加速
编辑:
关于我正在做什么的更多详细信息:
我有一个可枚举的字节数组
。我还有另一个字节数组
,我正在与其他数组进行比较。我正在按%相似性对可枚举项进行排序,并返回前500个
在F#和C#中,我都在做一个简单的嵌套for循环,它增加一个计数器。循环遍历枚举表中的特定项时,我创建(item,counter)的元组。创建完(item,counter)的新可枚举项后,我对计数器变量进行排序,获取前500个,然后转换回item的可枚举项
我放在并行程序中的部分是创建IEnumerable
官方文档:在这种情况下不应该使用数组理解。它比高阶函数慢一点,不能并行化 虽然我更喜欢@ildjarn的解决方案,但这里有一个与C#one等效的解决方案: 您也可以使用
Parallel。对于
直接:
// You need an uninitialized array to fill in later
let newItemArray = Array.zeroCreate items.Count
// Fill in the array in a parallel manner
Array.Parallel.iteri (fun i v ->
(* create object here - complex operations *)) newItemArray
让newItemArray=Array.zeroCreate items.Count
并行。对于(0,items.Count,
(趣味指数->
(*这里有复杂的东西*)
newItemArray。[索引]忽略
它更详细,但可以让您更好地控制。@pad:不一定更快,只是缺少细节。:/p出于某种原因,这需要3倍于我的顺序解决方案和7倍于我的并行C#解决方案的时间。@mydogisbox:您分析的是发布版本,而不是调试,对吗?它的发布和“启动时不调试”的“调试"常数未定义。需要明确的是,我正在使用
秒表
来计时运行,然后只是将经过的时间打印到控制台。iteri
是我尝试的第一种方法,只比我的顺序解略慢一点。Parallel.For
解决方案比我的顺序解耗时约3.5倍。你能告诉我吗u在F#Interactive with#time“on”中快速比较并行和顺序解决方案
?如果没有更多细节,很难猜测。我身边有一个秒表。时间是:并行解决方案为1.025,解决方案为0.436,iteri
解决方案为0.436。我的顺序F#解决方案每次运行大约0.360。我们需要更多关于F#和C#函数的细节。奇怪的是,F#版本在C#版本出现时无法扩展ons是的。我发现了。我使用了一些ref类型来解决一些并行性问题,结果是它破坏了我的性能。删除了一些,然后使用Array.Parallel.mapi,它工作起来很有魅力。我想是时候开始比较IL了……我知道这不容易,但你能给出一个可复制的示例吗?你编辑没有帮助那么多。
Array.Parallel.init items.Count (fun index ->
(* create object here - complex operations *))
// You need an uninitialized array to fill in later
let newItemArray = Array.zeroCreate items.Count
// Fill in the array in a parallel manner
Array.Parallel.iteri (fun i v ->
(* create object here - complex operations *)) newItemArray
let newItemArray = Array.zeroCreate items.Count
Parallel.For(0, items.Count,
(fun index ->
(* complex stuff here *)
newItemArray.[index] <- Object())
) |> ignore