我有一些代碼使用的Parallel.For做一些查詢和計數次數:在Parallel.For中刪除Interlocked.Add?
//...initialize _table with int values...
int elements=60;
int[] outerCounter=new int[elements];
Parallel.For(1, 2000, i0=>
{
int[] counter=new int[elements];
int nextPos0=_table[10+i0];
for(i1=i0+1; i1<1990; i1++){
//...here are also some additionale calculations done...
int nextPos1=_table[nextPos0+i1];
counter[nextPos1]++;
}
//synchronize
for(int i=0; i<elements;i++){
Interlocked.Add(ref outerCounter[i], counter[i]);
}
}
這個版本是這樣快則連續計算。但我想找到一種不同的解決方案來計算髮生的事件,因爲Interocked.Add是一個瓶頸。 我正在調查Plinq是否是一個選項,但目前還沒有找到一種方法來計算數組中nextPos1元素的發生。
我做了一個測試,在雙核兩個版本都有關相同。在一個quad上,你的版本慢了5%。這種方法很有趣,應該根據情況加快。 – michael 2011-03-16 18:58:30
我很好奇,如果你用SpinLocks替換Monitor鎖,性能如何改變四核。此外,您可能會考慮每次迭代進行更多的工作,例如將1-2000替換爲1到200,並且每次執行10次迭代。 – 2011-03-17 14:21:55