我试图弄清楚给函数一个参数或者只是使用成员变量是否更快。我有以下代码。
class Variable
{
private:
public:
Variable() {}
~Variable() {}
struct
{
static const int test = 3;
}testVar;
};
class VariableTransmit
{
private:
Variable var;
public:
VariableTransmit() {}
~VariableTransmit() {}
void testFunc1(int test)
{
int foo = 2;
foo = test;
}
void testFunc2()
{
int foo = 2;
foo = var.testVar.test;
}
};
struct
{
static const int test = 3;
}extVar;
int main(void)
{
VariableTransmit transmit;
clock_t prgstart, prgend;
prgstart = clock();
for(int i = 0; i <= 10000000; i++)
{
transmit.testFunc1(extVar.test);
}
prgend = clock();
printf("delivered: %.5f seconds\n\n", (float)(prgend - prgstart) / CLOCKS_PER_SEC);
prgstart = clock();
for(int i = 0; i <= 10000000; i++)
{
transmit.testFunc2();
}
prgend = clock();
printf("member: %.5f seconds\n\n", (float)(prgend - prgstart) / CLOCKS_PER_SEC);
return 0;
}
我测试了这段代码,令我惊讶的是testFunc1和testFunc2具有相同的处理速度。我原以为testFunc1会更快,因为它从结构中获取值作为参数并且只需设置它,而testFunc2必须访问var对象,然后从对象内部的struct中获取值。这个编译器是否特定优化(我使用的是VS2010顺便说一句。)或者我只是忽略了什么?
编辑:删除了基于意见的第二个问题。
答案 0 :(得分:0)
您的示例将通过visual-c ++编译器进行高度优化。 testFunc1
可能会更慢,具体取决于用于传递test
的注册,而来自的testFunc2
副本始终是相同的虚拟地址。
为什么?
您的Variable var
已在堆栈上创建。它将在创建对象时创建,因此编译器可以预测其虚拟地址。 (您可以在堆上创建Variable
对象,因此执行时间稍长。)
[关于公共/私人事物:通常,你可以随意做。我 - 个人 - 相信,在多线程环境中,公开课程的内部结构会增加偶然竞争条件的风险。]