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