在我正在编写的性能关键应用程序中,有一次我在一个紧密的循环中反复调用相同的函数数百次,总是使用相同的参数。我决定尝试通过将参数放在类中来避免参数传递的开销。例如,之前:
some_class p1;
some_class p2;
some_class p3;
for (int count = 12345678; count; --count)
foo(p1,p2,p3);
后:
class foo // Ignoring private / public for brevity
{
some_class& p1_;
some_class& p2_;
some_class& p3_;
foo(some_class& p1, some_class& p2, some_class& p3)
: p1_(p1), p2_(p2), p3_(p3_)
{}
void execute();
}
some_class p1;
some_class p2;
some_class p3;
foo f(p1,p2,p3);
for (int count = 12345678; count; --count)
f.execute();
我对结果的分析是:在= 11121 ms之前,之后= 11416ms。
我期待性能提升,因为我已经避免在堆栈上推送参数地址,而是稍微降低了。
为什么会这样?我正在使用Visual C ++ 2008 Express Edition,但我认为可能存在平台无关的答案。
答案 0 :(得分:0)
要完全避免调用该函数,请创建一些execute_loop(some_class& p1, some_class& p2, some_class& p3, const int iterations)
(迭代次数作为额外参数)并将循环移动到函数内部。
一些额外的推理(所有这些都可能由编译器从第一个优化级别开始自动化,但是嘿):
您策略中较少参数的交易伴随着类成员尊重的缺点。您的里程可能会有所不同。
如果参数未在函数内部被修改,则在函数签名中将它们声明为const
,这向编译器指示函数可以再次运行而无需重新读取参数。