c ++优化

Tim*_*upe 4 c++ optimization performance

我正在研究一些看似写得不好的现有c ++代码,并且经常被调用.我想知道我是否应该花时间更改它,或者编译器是否已经将问题优化掉了.

我正在使用Visual Studio 2008.

这是一个例子:

void someDrawingFunction(....)
{
  GetContext().DrawSomething(...);
  GetContext().DrawSomething(...);
  GetContext().DrawSomething(...);
  .
  .
  .
}
Run Code Online (Sandbox Code Playgroud)

我将如何做到这一点:

void someDrawingFunction(....)
{
  MyContext &c = GetContext();
  c.DrawSomething(...);
  c.DrawSomething(...);
  c.DrawSomething(...);
  .
  .
  .
}
Run Code Online (Sandbox Code Playgroud)

Ada*_*eld 25

不要猜测你的程序在哪里花时间. 首先介绍您的瓶颈,然后优化这些瓶颈.

至于GetContext(),这取决于它有多复杂.如果它只是返回一个类成员变量,那么编译器可能会内联它.如果GetContext()必须执行更复杂的操作(例如在表中查找上下文),编译器可能没有内联它,您可能希望只调用一次,就像在第二个片段中一样.

如果您正在使用GCC,则还可以GetContext()使用该pure属性标记该函数.这将允许它执行更多优化,例如公共子表达式消除.


Mic*_*hne 11

如果您确定这是性能问题,请更改它.如果GetContext是一个函数调用(而不是宏或内联函数),那么编译器每次都会调用它,因为编译器不一定能看到它在做什么,因此,编译器可能赢了不知道它可以消除呼叫.

当然,你需要确保GetContext总是返回相同的东西,并且这个'优化'是安全的.


Shi*_*Yip 8

如果它在逻辑上是正确的,那么第二种方式,即多次调用GetContext()一次不会影响你的程序逻辑,即使你对它进行分析并证明没有性能差异,我也会采用第二种方式.因此,下一个查看此代码的开发人员不会再问同一个问题.