在我的計劃要慢,我想detemine多少個號碼有9位數字如何,許多有8位等與這個循環:數組遍歷:並行性能比非平行
for (int i = 0; i < 60000000; i++)
{
if (a[i] >= 1000000000) { p[10] += 1; }
else if (a[i] >= 100000000) { p[9] += 1; }
else if (a[i] >= 10000000) { p[8] += 1; }
else if (a[i] >= 1000000) { p[7] += 1; }
else if (a[i] >= 100000) { p[6] += 1; }
else if (a[i] >= 10000) { p[5] += 1; }
else if (a[i] >= 1000) { p[4] += 1; }
else if (a[i] >= 100) { p[3] += 1; }
else if (a[i] >= 10) { p[2] += 1; }
else { p[1] += 1; }
}
我並行循環像這樣:
void partiton(int f, int l, int[] p)
{
Parallel.Invoke(()=>calc(f,l/2,p),()=>calc(l/2,l,p));
}
void calc(int f, int l, int[] p)
{
for (int i = f; i < l; i++)
{
if (a[i] >= 1000000000) { p[10] += 1; }
else if (a[i] >= 100000000) { p[9] += 1; }
else if (a[i] >= 10000000) { p[8] += 1; }
else if (a[i] >= 1000000) { p[7] += 1; }
else if (a[i] >= 100000) { p[6] += 1; }
else if (a[i] >= 10000) { p[5] += 1; }
else if (a[i] >= 1000) { p[4] += 1; }
else if (a[i] >= 100) { p[3] += 1; }
else if (a[i] >= 10) { p[2] += 1; }
else { p[1] += 1; }
}
}
private void button1_Click(object sender, EventArgs e)
{
Stopwatch w = new Stopwatch();
w.Restart();
int f = 0;
int l = 60000000;
Parallel.Invoke(() => calc(f, l/2, p),() => calc(l/2, l, p));
w.Stop();
label1.Text = w.Elapsed.ToString();
}
但基準是: 順序:0.3834 並行:0.6864
爲什麼並行代碼慢?我的代碼有問題嗎?我的CPU是AMD Phenom™II X4。型號,955.
也許你應該嘗試分割你的對象。你可以用兩種操作來引用同一個對象,所以也許一個'lock'會減慢它的速度。 (尤其是使用兩個*線程寫入*的int [] p'對象。) –
嘗試通過不同的p,例如, p1和p2,並在調用完成後將它們的數據相加。 – FPK
由於它可能是內存IO綁定代碼,因此您應該確保線程在寫入時不會觸及彼此的數據(即,建議@FPK - 分別爲每個半部分計算直方圖並在最後合併)。 –