2009-06-13 24 views
-1

我不知道我是否正確表達了它,但是對於一個簡單的例子,假設我們有一組Point3值(比如1M)。更好的多線程:單個函數或集合函數

我們有一種稱爲偏移的方法,在這些值上添加另一個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 2009-06-13 19:17:00

+0

用於將操作應用於集合中的大量項目。 – 2009-06-13 19:19:48

回答

1

選項1是邏輯核心操作。使用.NET 4.0,您可以使用Zip操作符實現與選項2相同的操作。從內存而不是,:

var newPoints = Offset(firstPoints, secondPoints); 

你會寫:

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

你可能要考慮讓Offset擴展方法上Point3如果你使用.NET 3.5爲好。 (或者,如果你控制了Point3類型,這聽起來像一個合理補充 - 這將是很好的調用寫(p1, p2) => p1 + p2Zip

如果你不使用.NET 4.0,但Zip吸引你,我們有一個實現在MoreLINQ - 它非常簡單

到目前爲止,沒有什麼與多線程相關......現在我不知道是否有.NET 4.0中的Zip的PLINQ實現,但它會有意義的是有一個,國際海事組織。

2

你應該有第一個,第二個叫第一個。

2

#1似乎更簡單,更清潔,並且您可以隨時從外部並行化它。我沒有看到僅僅使用#2的理由,除非你忽略了一個關鍵的細節。如果你決定以同樣的方式對這種類型的循環進行例行並行處理,請使#2調用#1。

1

我的答案是兩者。我喜歡最簡單的功能,所以#1是好的。同時,對列表進行操作的簡便方法非常有用,並且可以在適當的情況下完成繁殖線程的工作。

我的一個用Java(幾乎所有的語言,但是Java已經足夠新,他們本應該知道的更好)的牛肉是他們仍然沒有做好使基礎庫利用多線程,或者提供了許多機制來幫助開發者。實際上應該有一個通用函數來「將此函數應用於此列表中的所有元素」,並且具有該函數可以計算出可用內核的數量,列表的大小,開銷是多少,以及相應地進行優化。