Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 并行化阵列创建_F#_Array Initialization - Fatal编程技术网

F# 并行化阵列创建

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,因此我可以将相同的索引用于我在

F#

C#

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