簡體   English   中英

為什么在 for 循環中引用全局變量要慢得多?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM