通过避免功能提高程序速度? (C ++)

时间:2012-03-04 03:55:45

标签: c++ function optimization compiler-construction inline

在程序编程方面,功能分解是维护复杂代码的理想选择。但是,函数很昂贵 - 添加到调用堆栈,传递参数,存储返回地址。所有这些都需要额外的时间!当速度至关重要时,我怎样才能充分利用这两个世界?我想要一个高度分解的程序,没有函数调用引入的任何必要开销。我熟悉关键字:“inline”,但这似乎只是对编译器的建议,如果程序员错误地使用它会产生更慢的程序。我正在使用g ++,所以-03标志会优化我调用函数调用函数的函数。 我只是想知道,如果我的问题是有效的,并且有任何方法可以解决这个问题。

3 个答案:

答案 0 :(得分:4)

首先,与处理性能问题一样,您应该尝试使用分析器测量您的瓶颈。出来的第一件事通常不是函数调用,而是大幅度的调用。如果你这样做,请继续阅读。

然后,您可以使用inline关键字预测一下您想要内联的功能。编译器通常足够聪明,可以知道内联的内容和内联的内容(它可以内联您忘记的函数,如果他认为它没有帮助,可能不会内联你提到的内容。)

如果(真的)你仍然希望提高函数调用的性能并想强制内联,那么一些编译器允许你这样做(参见question)。请考虑大规模内联可能实际上会降低性能:您的代码将使用大量内存,并且您可能会在代码上获得比以前更多的缓存未命中(这不是很好)。

答案 1 :(得分:1)

如果这是您要担心的特定代码,您可以自己测量时间。只需在循环中运行很多次,就可以获得前后的系统时间。使用差异来查找每次通话的平均时间。

与往常一样,您获得的数字是主观的,因为它们会因您的系统和编译器而异。您可以比较从不同方法获得的时间,以查看哪些通常更快,例如用宏替换函数。我的猜测是,你不会注意到太大的差异,或者至少它是无关紧要的。

如果您不知道减速的位置,请遵循J.N的建议并使用代码分析器并优化所需的位置。根据经验,总是通过引用或const引用将大对象传递给函数,以避免复制时间。

答案 2 :(得分:-1)

我非常怀疑速度是那种特殊的,但我的建议是使用预处理器宏。

例如

#define max(a,b) ( a > b ? a : b )

这对我来说似乎很明显,但我不认为自己是C ++的期望,所以我可能误解了这个问题。