2009-06-13 6 views
-1

私はそれを正しく言いましたかどうか分かりませんが、単純な例として、Point3値の集合(たとえば1M)があるとしましょう。より良いマルチスレッド:単一の関数またはコレクション関数

Offsetというメソッドがあり、これらの値に別のPoint3値を追加し、新しいPoint3値を返します。メソッドが静的であるとしましょう。

Point3タイプは不変です。

質問は、私はこのような方法を持っている必要がありますされています。私には

public static Point3 Offset (Point3 a, Point3 b) 

または

public static IEnumerable<Point3> Offset (IEnumerable<Point3> a, IEnumerable<Point3> b) 

を#1異なるスレッドに対して個別のタスクにタスクを打破するために、より良い選択のように思えます。

あなたはどう思いますか? #1や#2のメリットは?

+0

どこにマルチスレッドが入っているのですか? – chris166

+0

コレクション内の多数のアイテムに対する操作をアプリに適用します。 –

+0

列挙子がスレッドセーフであれば、2番目のパラレル化しかできないので、私は尋ねました。 Avishからの回答を参照 – chris166

答えて

1

オプション1は論理的なコア操作です。 .NET 4.0では、Zip演算子を使用してオプション2と同じ操作を実現できます。メモリからは、代わりに:

var newPoints = Offset(firstPoints, secondPoints); 

あなたが書いたと思います:

var newPoints = firstPoints.Zip(secondPoints, (p1, p2) => Offset(p1, p2)); 

あなたは、あなたにも、.NET 3.5を使用している場合OffsetPoint3上の拡張メソッドを行うことを検討することをお勧めします。あなたがPoint3タイプをコントロールしている場合(あるいは、これは論理和のように聞こえる - 。Zipへの呼び出しで(p1, p2) => p1 + p2を書くためにいいだろう

あなたはあなたに.NET 4.0が、Zip控訴を使用していない場合は、我々 MoreLINQの実装を持っています - それはかなり簡単です

これまでのところ、マルチスレッドに関連するものはありません... .NET 4.0ではPLINQの実装がZipであるかどうかはわかりませんが、 IMO。

+0

ありがとうございました。同意する。また、#1: var points = Parallel.Foreach(origPoints、Offset)などで、このようなことができると思いました。私はTPLを使用していないので、完全な構文はわかりません。 オフセットポイント3を使用して、ポイントの集合に対してオフセット操作を並列化する場合は、どうしますか? –

+0

あなたは正しいです、オフセットは論理的な追加です。私は、アプリケーションでそれを使うことができるアプリケーションのユーザーのための高レベルの名前を作っています。高レベルでは、アプリとの統合の点で+演算子以上の機能を果たします。 –

+1

* single *オフセットを使用するのは簡単です.Selectを使用する場合に過ぎません。 PLINQで簡単に並列化することができます。 (ちょうど1つの点列を別の点列に固定的に投影しています)。これは、「別の系列による配列をオフセットする」というのは難しいことです。 –

2

おそらく最初のコールを持っていて、2番目のコールを最初に呼び出す必要があります。

2

#1はよりシンプルでクリーンなように見えますが、いつでも外部から並列化することができます。私は#2を排他的に使用する理由は見当たりません。このようなループをルーチン的に並列化したい場合は、#2を#1にしてください。

1

私の答えは両方です。私はsimpiliest関数を可能にするのが好きなので、#1は良いです。同時に、リストを操作する便利な方法は有用であり、適切な場合にはスレッドを生成するという困難な作業を行うことができます。

私の牛肉はJava(よく、ほとんどすべての言語ですが、Javaはそれほどよく知られているはずです)はまだ基本的なライブラリを複数のスレッドの利点を生かしていないということです。開発者を支援する多くの仕組みが用意されていました。 「この関数をこのリストのすべての要素に適用する」という一般的な関数があり、その関数で使用可能なコアの数、リストの大きさ、オーバーヘッドの量、およびそれに応じた最適化を把握する必要があります。

関連する問題