我有以下两个文件:-
单.cpp :-
#include <iostream>
#include <stdlib.h>
using namespace std;
unsigned long a=0;
class A {
public:
virtual int f() __attribute__ ((noinline)) { return a; }
};
class B : public A {
public:
virtual int f() __attribute__ ((noinline)) { return a; }
void g() __attribute__ ((noinline)) { return; }
};
int main() {
cin>>a;
A* obj;
if (a>3)
obj = new B();
else
obj = new A();
unsigned long result=0;
for (int i=0; i<65535; i++) {
for (int j=0; j<65535; j++) {
result+=obj->f();
}
}
cout<<result<<"\n";
}
和
多个.cpp :-
#include <iostream>
#include <stdlib.h>
using namespace std;
unsigned long a=0;
class A {
public:
virtual int f() __attribute__ ((noinline)) { return a; }
};
class dummy {
public:
virtual void g() __attribute__ ((noinline)) { return; }
};
class B : public A, public dummy {
public:
virtual int f() __attribute__ ((noinline)) { return a; }
virtual void g() __attribute__ ((noinline)) { return; }
};
int main() {
cin>>a;
A* obj;
if (a>3)
obj = new B();
else
obj = new A();
unsigned long result=0;
for (int i=0; i<65535; i++) {
for (int j=0; j<65535; j++) {
result+=obj->f();
}
}
cout<<result<<"\n";
}
我正在使用带有标志 -O2 的 gcc 版本 3.4.6
这是我得到的计时结果:-
多 :-
real 0m8.635s
user 0m8.608s
sys 0m0.003s
单身的 :-
real 0m10.072s
user 0m10.045s
sys 0m0.001s
另一方面,如果在 multiple.cpp 我颠倒了类派生的顺序: -
class B : public dummy, public A {
然后我得到以下时间(由于代码需要对 this 指针进行“thunk”调整,这比单继承的时间要慢一些):-
real 0m11.516s
user 0m11.479s
sys 0m0.002s
知道为什么会发生这种情况吗?就循环而言,为所有三种情况生成的程序集似乎没有任何区别。我还有其他地方需要看吗?
此外,我已将进程绑定到特定的 cpu 内核,并使用 SCHED_RR 以实时优先级运行它。
编辑:- 这被 Mysticial 注意到并由我复制。做一个
cout << "vtable: " << *(void**)obj << endl;
就在 single.cpp 中的循环导致 single 也像 public A、public dummy 一样以 8.4 秒的速度进入多个时钟之前。