这可能是一个初学者的问题。
A.H
class A
{
private:
short* arrObject;
public:
A();
~A();
void func0();
};
A.cpp
#include "A.h"
#include "Timer.h"
#include <iostream>
using namespace std;
A::A()
{
arrObject = new short[4];
}
A::~A()
{
}
void A::func0() {
Timer timer; // this class measures time in seconds
short* arrScope = new short[4];
timer.start();
for (int i = 0; i < 1000000; i++)
{
arrScope[3] = 987;
}
cout << "Writing in scope array " << timer.end() << endl;
timer.start();
for (int i = 0; i < 1000000; i++)
{
arrObject[3] = 987;
}
cout << "Writing in object array " << timer.end() << endl;
cout << endl;
}
在func0
的实例上调用A
会产生输出:
Writing in scope array 0
Writing in object array 0.000771421
这意味着使用对象属性比使用范围变量慢。为什么会这样?
我使用的是Visual Studio 2013,因此它是Microsoft C / C ++编译器。 在VS中选择优化为“最大化速度/ O2”
编辑:
此外,如果我将A.h改为:
class A
{
private:
short arrObject[4];
public:
A();
~A();
void func0();
};
并失去A.cpp中构造的初始化,差异消失,输出为:
Writing to scope array 0
Writing to object array 3.31082-007
答案 0 :(得分:1)
好的,是的,这是优化的事情。
如果我禁用所有优化,则两个计时器都会显示确切的时间。 另外,如果我保持优化并且稍微搞乱代码:
void A::func0() {
Timer timer;
short* arrScope = new short[4];
timer.start();
for (int i = 0; i < 1000000; i++)
{
arrScope[i % 4] = i;
}
cout << "Writing in scope array " << timer.end() << endl;
timer.start();
for (int i = 0; i < 1000000; i++)
{
arrObject[i%4] = i;
}
cout << "Writing in object array " << timer.end() << endl;
cout << endl;
}
计时器也显示同样的时间。
Run #1: 0.00263972 / 0.00267415
Run #2: 0.00069362 / 0.00099159
Run #3: 0.00251192 / 0.00250728