问题的意图是使用局部变量而不是成员的一个很好的理由,我不想在这里测试编译器优化......请
如果您认为我的比较不完美,请提供替代代码。
任何人都可以详细解释为什么?为什么本地访问速度更快,即使它每次调用函数时都必须创建堆栈并拆除堆栈虽然成员它只需要取消引用这个指针我可以看到本地堆栈更快?
结果当地时间:271 会员时间:418
代码 :
class local {
public:
void incr() {
int i;
++i;
}
};
class Member {
int i;
public:
void incr() {
++i;
}
};
#include <ctime>
#include <iostream>
#include <time.h>
int main(int argc, char**argv) {
time_t star;
time_t end;
Member m;
local l;
time(&star);
for(unsigned int j=0;j<200000;++j)
for(unsigned int i=0;i<400000;++i) {
l.incr();
}
time(&end);
std::cout << "\nlocal time:" << end-star << "\n";
time(&star);
for(unsigned int j=0;j<200000;++j)
for(unsigned int i=0;i<400000;++i) {
m.incr();
}
time(&end);
std::cout << "\nmember time:" << end-star<< "\n";
return 0;
}
新代码:g++ -O1 localmember.cpp
当地时间:128 会员时间:117
代码 :
class local {
public:
int diff(int a, int b) {
int d=0;
d=a-b;
return d;
}
};
class Member {
int d;
public:
int diff(int a, int b) {
d=0;
d=a-b;
return d;
}
};
static int gr;
#include <ctime>
#include <iostream>
#include <time.h>
void dumpdiff(int r) {
gr=r ;
}
int main(int argc, char**argv) {
time_t star;
time_t end;
Member m;
local l;
int r=0;
int r2=0;
time(&star);
int in1=2,in2=0;
for(unsigned int j=0;j<200000;++j)
for(unsigned int i=0;i<200000;++i) {
r = l.diff(in1*i,in2*i);
in1+=1;
in2+=1;
if(r){r2=r;}
dumpdiff(r);
}
time(&end);
std::cout << "\nlocal time:" << end-star << "\n";
time(&star);
for(unsigned int j=0;j<200000;++j)
for(unsigned int i=0;i<200000;++i) {
r = m.diff(in1,in2);
in1+=1;
in2+=1;
if(r){r2=r;}
dumpdiff(r);
}
time(&end);
std::cout << "\nmember time:" << end-star<< "\n";
return 0;