-1

言い方が正しかったかどうかはわかりませんが、簡単な例として、Point3 値 (1M など) のコレクションがあるとします。

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

Point3 型は不変です。

問題は、次のような方法が必要かどうかです。

public static Point3 Offset ( Point3 a, Point3 b )

また

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

私には、タスクを異なるスレッドの別々のタスクに分割するためのより良い選択のように思えます。

どう思いますか?そして、#1または#2の利点は?

4

4 に答える 4

2

#1 はよりシンプルでクリーンに見え、いつでも外部から並列化できます。重要な詳細を述べることを怠っていない限り、#2 だけを使用する理由はわかりません。この種のループを同じ方法で定期的に並列化する場合は、#2 呼び出し #1 を作成します。

于 2009-06-13T19:22:14.643 に答える
2

おそらく最初の呼び出しを行い、2 番目の呼び出しを最初に行う必要があります。

于 2009-06-13T19:13:35.290 に答える
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 も使用している場合はOffset、拡張メソッドを作成することを検討することをお勧めします。Point3(または、タイプを制御する場合Point3、これは論理的な追加のように聞こえ(p1, p2) => p1 + p2ますZip。.

.NET 4.0 を使用していなくても魅力がある場合は、 MoreLINQZipに実装があります。これは非常に簡単です。

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

于 2009-06-13T22:40:28.333 に答える
1

私の答えは両方です。私は可能な限り単純な機能を持っているのが好きなので、#1が良いです. 同時に、リストを操作する便利なメソッドは非常に便利で、必要に応じてスレッドを生成するという大変な作業を行うことができます。

Java に関する私の不満の 1 つは (ほぼすべての言語ですが、Java は十分に新しいので、彼らはもっとよく知っているはずです)、ベース ライブラリに複数のスレッドを活用させる、または、複数のスレッドを実行するための多くのメカニズムを提供することをまだうまく行っていないということです。開発者を支援します。「この関数をこのリスト内のすべての要素に適用する」ための一般的な関数が実際に必要であり、その関数に使用可能なコアの数、リストの大きさ、オーバーヘッドを把握させ、それに応じて最適化する必要があります。

于 2009-06-13T19:30:04.547 に答える