我正在遵循并行編程模式:使用 .NET Framework 4 理解和應用并行模式第 107 頁上的示例(https://www.microsoft.com/en-us/download/details.aspx?id=19222)。據稱,與使用 Threadlocal.Value 本身相比,使用 ThreadLocal 的 Value 成員的本地副本速度更快。我對此進行了測試,確實如此。但為什么?從代碼中可以看出,_vector2.Value 的本地副本保存在 vector2 中,并且該本地副本用于對所有項求和。如果您使用 _vector2.Value[i] += _vector1.Value[i] 而不是 vector2[i] += vector1[i] 代碼運行同樣好,盡管速度較慢。這就是文章中所說的。現在 int[] 是一個引用類型。這意味著當您在 vector2 中進行復制時,您實際上是在復制 ThreadLocal 的 Value 成員中原始 int[] 的引用。通過注釋證實了這一點_vector2.Value = vector2。打印結果保持不變。所以,我認為這個任務沒有必要?,F在,由于 _vector2.Value 和 vector2 引用相同的數據,為什么使用本地副本 (vector2) 仍然更快?在我的測試中大約快了 4 倍。有人知道我錯過了什么嗎? class ReferenceList { const int VECTOR_LENGTH = 100000000; private ThreadLocal<int[]> _vector1 = new ThreadLocal<int[]>(() => Enumerable.Range(1, VECTOR_LENGTH).ToArray()); private ThreadLocal<int[]> _vector2 = new ThreadLocal<int[]>(() => Enumerable.Range(1, VECTOR_LENGTH).ToArray()); internal void DoWork() { int[] vector1 = _vector1.Value; int[] vector2 = _vector2.Value; for (int i = 0; i < VECTOR_LENGTH; i++) { // This is the fast way (as in the document) vector2[i] += vector1[i]; // This is the slow way //_vector2.Value[i] += _vector1.Value[i]; } // Since int[] is a reference type. This step is not needed, I think. The result is not influenced when commenting out this line _vector2.Value = vector2; Console.WriteLine($"Thread-{Thread.CurrentThread.ManagedThreadId} Result: {String.Join(", ", _vector2.Value.Take(10))}"); }
1 回答

當年話下
TA貢獻1890條經驗 獲得超9個贊
vector1
是直接對數組的引用。沒有什么比這更快的了。
_vector1
不是直接對數組的引用。_vector1.Value
將產生相同的值 - 但根據源代碼,需要付出一些努力才能獲得該值。因此,每次您要求.Value
再次承受(執行方法等)性能損失時(即使您知道它將返回相同的值,也需要付出一些努力才能解決)。這忽略了其他相關成本,例如數據局部性可能減少、緩存未命中增加等。
- 1 回答
- 0 關注
- 127 瀏覽
添加回答
舉報
0/150
提交
取消