试图避免函数调用中的参数开销

时间:2014-04-24 03:41:54

标签: c++ function parameter-passing

在我正在编写的性能关键应用程序中,有一次我在一个紧密的循环中反复调用相同的函数数百次,总是使用相同的参数。我决定尝试通过将参数放在类中来避免参数传递的开销。例如,之前:

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,但我认为可能存在平台无关的答案。

1 个答案:

答案 0 :(得分:0)

要完全避免调用该函数,请创建一些execute_loop(some_class& p1, some_class& p2, some_class& p3, const int iterations)(迭代次数作为额外参数)并将循环移动到函数内部。


一些额外的推理(所有这些都可能由编译器从第一个优化级别开始自动化,但是嘿):

  1. 您策略中较少参数的交易伴随着类成员尊重的缺点。您的里程可能会有所不同。

  2. 如果参数未在函数内部被修改,则在函数签名中将它们声明为const,这向编译器指示函数可以再次运行而无需重新读取参数。