在过程式编程中,函数分解是维护复杂代码的理想选择。 然而,函数的成本很高——添加到调用堆栈、传递参数、存储返回地址。所有这些都需要额外的时间!当速度至关重要时,我怎样才能两全其美?我想要一个高度分解的程序,而不需要函数调用带来任何必要的开销。 我熟悉关键字:“inline”,但这似乎只是对编译器的建议,如果程序员使用不当,它会产生更慢的程序。 我正在使用 g++,所以 -03 标志会优化我的调用函数的函数吗? 我只是想知道我的担忧是否合理以及是否有任何方法可以解决这个问题。
首先,与往常一样,在处理性能问题时,您应该尝试使用分析器来衡量您的瓶颈是什么。首先出现的通常不是函数调用,而且很大程度上不是函数调用。如果您这样做了,请继续阅读。
然后,您可以使用
inline
关键字来预测您想要内联的函数。编译器通常足够聪明,知道什么应该内联,什么不应该内联(它可以内联你忘记的函数,并且如果他认为这没有帮助,可能不会内联你提到的一些函数)。
如果(确实)您仍然想提高函数调用的性能并希望强制内联,某些编译器允许您这样做(请参阅此问题)。请考虑大量内联实际上可能会降低性能:您的代码将使用大量内存,并且您的代码可能会比以前有更多的缓存未命中(这不好)。
如果您担心的是一段特定的代码,您可以自己测量时间。只需大量循环运行它并获取前后的系统时间即可。使用差值找出每次调用的平均时间。
一如既往,您获得的数字是主观的,因为它们会根据您的系统和编译器而有所不同。您可以比较不同方法获得的时间,看看哪种方法通常更快,例如用宏替换函数。但我的猜测是,您不会注意到太大的差异,或者至少是无关紧要的。
如果您不知道哪里变慢,请遵循 J.N 的建议并使用代码分析器并在需要的地方进行优化。根据经验,始终通过引用或 const 引用将大对象传递给函数,以避免复制时间。
我非常怀疑速度就是那么重要,但我的建议是使用预处理器宏。
例如
#define max(a,b) ( a > b ? a : b )
这对我来说似乎是显而易见的,但我不认为自己是 C++ 的期望者,所以我可能误解了这个问题。