[英]Why it is significantly slower to reference global variables in a for loop?
我正在讀一本書,上面說使用局部變量來消除不必要的內存引用。 例如,下面的代碼效率不高:
int gsum; //global sum variable
void foo(int num) {
for (int i = 0; i < num; i++) {
gsum += i;
}
}
使用以下代碼效率更高:
void foo(int num) {
int fsum;
for (int i = 0; i < num; i++) {
fsum += i;
}
gsum = fsum;
}
我知道第二種情況使用存儲在寄存器中的局部變量。 這就是為什么它要快一點,而在第一種情況下, gsum
必須從主內存中檢索太多次。
但我還有疑問:
Q1- gcc 編譯器是否足夠聰明來檢測它並隱式使用寄存器來存儲全局變量,以便后續引用將完全像第二種情況一樣使用寄存器?
Q2- 如果由於某種原因編譯器無法優化,那么我們仍然有緩存。 從緩存中引用全局變量仍然非常快,但我看到一些使用局部變量的程序比引用全局變量的程序快 10 倍。 為什么是這樣?
Q1:其他函數可能會需要該寄存器,這些函數將在后續調用foo
之間調用。 這意味着每當調用此函數時, gsum
都需要在寄存器中進出。
Q2:包含gsum
的頁面可能會在緩存中停留一段時間。 但是,根據您的計算機正在執行的其他操作,該頁面可能會被寫入交換空間,以便為其他頁面騰出內存空間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.