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# を使用しない場合は、わずかに高速です。C# を使用するParallel.For
と、実行にかかる時間が半分になります。F# を適切に並列化して、C# と同じパフォーマンスを向上させるにはどうすればよいですか?
私がこれまでに試した方法は だったArray.Parallel.Iteri
ので、C# で使用した配列トリックに同じインデックスを使用できましたが、高速化する代わりに低速化しました。
編集:
私がやっていることの詳細:
列挙可能な がありbyte array array array
ます。私は他のbyte array array array
ものと比較している別のものを持っています。列挙可能なものを類似度 % でソートし、最初の 500 を返します。
F# と C# の両方で、カウンターをインクリメントする単純なネストされた for ループを実行しています。Enumerable 内の特定のアイテムをループ処理したら、(item, counter) のタプルを作成します。(アイテム、カウンター) の新しい列挙型の作成が完了したら、それをカウンター変数で並べ替え、最初の 500 を取得してから、アイテムの列挙型に戻します。
Parallel.For の中に入れている部分は、IEnumerable<Tuple<item, int>>