|
|
|
|
|
在本文中,我們將做一個實驗,目的是證明在C#中使用內(nèi)存局部預(yù)取,是可以以獲得更好的性能,即是執(zhí)行速度更快。
我們將看兩個例子,我們在矩陣上迭代,并計算有多少元素大于零。為簡單起見,假設(shè)我們有一個數(shù)組數(shù)組,大小為 5000×5000。
代碼 1:
for (int i = 0; i < matrix.Length; i++)
{
for (int j = 0; j < matrix.Length; j++)
{
if (matrix[i][j] > 0) //行先
{
result++;
}
}
}
代碼 2:
for (int i = 0; i < matrix.Length; i++)
{
for (int j = 0; j < matrix.Length; j++)
{
if (matrix[j][i] > 0) //列先
{
result++;
}
}
}
你認為哪種算法會執(zhí)行得更快?
如果你猜到了第一個,那你是對的。以下是我們機器上的基準測試結(jié)果:
但是,我們應(yīng)該明白為什么會這樣。
數(shù)組和矩陣(數(shù)組的數(shù)組)按順序存儲在內(nèi)存中,矩陣實際上是按行優(yōu)先存儲的,這意味著當(dāng)我們逐行訪問矩陣數(shù)據(jù)時,我們將訪問后續(xù)的內(nèi)存位置,這就是我們?nèi)绾螐膬?nèi)存局部性原則中受益,并獲得改進的性能。
相關(guān)文章