今天偶爾看道了計算機體系結構中有關編譯器優化對提高Cache性能的影響一節,其中說道如果有數組,假設int a[5000][100],我們寫下如下代碼,則第一種效率高于第二種。原因是第二個循環以100*4字節的跨距訪問存儲器,勢必造成Cache失效次數增加,增大了訪存時間,而第一種循環順序地訪問一個Cache塊中地元素,減少了失效次數,提高了Cache性能。
?14-4(a)
?2for?(row=0;?row<5000;?row++)

?3
{
?4??for?(?col=0;?col<100;?col++?)

?5??
{
?6?????sum?=?sum?+?a[row][col];
?7??}
?8}
?94-4(b)
10for?(col=0;?col<100;?col++?)

11
{
12??for?(row=0;?row<5000;?row++)

13??
{
14????sum?=?sum?+?a[row][col];
15??}
16}
但我又想起了林銳博士的高質量C++編程手冊,其中寫到:在多重循環中,如果有可能,應當將最長的循環放在最內層,最短的循環放在最外層,以減少CPU 跨切循環層的次數。按照他的說法,上面二種寫法,后一種比較好,這不就跟體系結構書上說的矛盾了嗎?我不知道誰對誰錯,也不知道減少CPU 跨切循環層的次數是怎么具體影響效率,大家不知有何看法。
























但我又想起了林銳博士的高質量C++編程手冊,其中寫到:在多重循環中,如果有可能,應當將最長的循環放在最內層,最短的循環放在最外層,以減少CPU 跨切循環層的次數。按照他的說法,上面二種寫法,后一種比較好,這不就跟體系結構書上說的矛盾了嗎?我不知道誰對誰錯,也不知道減少CPU 跨切循環層的次數是怎么具體影響效率,大家不知有何看法。