繁体   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