【问题标题】:Increase Program Speed By Avoiding Functions? (C++)通过避免函数来提高程序速度? (C++)
【发布时间】:2012-03-04 03:55:45
【问题描述】:

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

【问题讨论】:

  • 通常不用担心。即使您不使用 inline 关键字,一个好的编译器也可能会尽可能为您内联。
  • 您的担忧无效。有些人在做一些可能很重要的事情,但是(1)不知何故,我不相信你处于那种情况,(2)那些人不会通过猜测和道听途说走得太远。
  • 对 C++ 并不理想(我在 JS 上),但您还必须权衡对可维护、可重用和可单独测试的代码的担忧。
  • 优化的第一条规则:你的代码总是足够快,直到它不够快。你会知道什么时候发生。

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


【解决方案1】:

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

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

如果(真的)您仍想提高函数调用的性能并希望强制内联,一些编译器允许您这样做(请参阅question)。请注意,大量内联实际上可能会降低性能:您的代码将使用大量内存,并且您的代码可能会比以前遇到更多的缓存未命中(这不好)。

【讨论】:

    【解决方案2】:

    如果您担心的是一段特定的代码,您可以自己测量时间。只是循环运行很多次,获取前后的系统时间。使用差值计算每次调用的平均时间。

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

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

    【讨论】:

      【解决方案3】:

      我非常怀疑速度是否那么重要,但我的建议是使用预处理器宏。

      例如

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

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

      【讨论】:

      • (1) 宏在 C++ 中不是惯用的,模板在各个方面都更安全,同样有效,并且会尊重范围。 (2) 正如其他答案(此处和其他地方)中所解释的那样,仅仅内联很多东西并不太可能提高性能。
      猜你喜欢
      • 2017-07-04
      • 1970-01-01
      • 2019-04-25
      • 2014-06-10
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 2014-04-13
      • 1970-01-01
      相关资源
      最近更新 更多