【问题标题】:Will inline speed up void a(string b) { cout << b; }内联会加速 void a(string b) { cout << b; }
【发布时间】:2011-09-27 02:27:00
【问题描述】:

对于一个作业,我们应该编写两种处理输出的方法。一种输出字符串,一种输出整数。

基本上我们有两个方法调用另一个方法:

void TheClass::displayString(string str){ cout << str; }
void TheClass::displayNumber(int n) { cout << n; }

内联会通过不调用另一个函数来节省一些开销来加快速度或 它会在命名空间等方面为 cout 创建更多内容吗?

inline void TheClass::displayString(string str) { cout << str; }
inline void TheClass::displayNumber(int n) { cout << n; }

【问题讨论】:

  • 您的计算机可以围绕std::cout &lt;&lt; b 运行几乎任何类型的b(例外是具有(故意)复杂输出机制的用户定义类)。你不必担心这个。
  • 添加到 Chris 的评论中,许多专业人士不再担心这种级别的性能。更重要的是代码结构良好且易于理解。你可能会担心它会发现在运行代码一千年中,总共损失了一秒钟!更好的方法是在有明显好处的地方担心性能,然后分析代码并查看真正的瓶颈在哪里!
  • inline 关键字不一定内联函数。内联函数可能会产生不利影响,并减慢速度。内联生成更多代码,这意味着更低的局部性,并且新的代码页必须以更高的频率进入。不管怎样,通过值传递std::strings 可能比通过内联函数调用节省的成本要高得多。不要优化,直到您的分析器告诉您要优化什么。并且不要运行分析器,除非存在可以想象的性能问题。

标签: c++ performance methods inline overhead


【解决方案1】:

命名空间与它没有任何关系。

您可能不会在这里看到任何好处,原因很简单:函数太小了,我希望编译器会内联它无论如何

请记住,关键字inline 是一个提示 而不是指令,通常您可以让您的工具链决定何时内联。这样做很好。

【讨论】:

    【解决方案2】:

    我同意 Tomalak 的观点,内联只是一个提示,内联函数几乎没有任何好处。 今天的处理器是如此之快,以至于再调用一个函数根本无关紧要。

    我在 opengl 编程中使用了inline 函数。 OpenGL 程序是无限循环。为了使循环尽可能快地运行,您必须非常高效地编程,这样它才能保持对用户的响应并顺利生成图像。 我相信声明一些函数inline 会使程序运行得更快更流畅.

    毕竟,不要指望这种技术会带来巨大的性能提升,在极端情况下可能只会减少 1-2% 的运行时间。

    【讨论】:

    • 我希望它们不是真的无限!
    • 在极端情况下,您会看到远大于 1-2% 的差异。内联是启用“现代”C++ 程序(大量使用 Boost、STL、一般模板等)的关键特性。
    【解决方案3】:

    对于这两个函数,无论编译器是否内联函数,您可能都看不到任何值得注意的区别。

    原因是流插入 (&lt;&lt;) 相当慢。比一个简单的(非内联)函数调用慢得多。

    而且,正如其他人已经指出的那样,您应该真正习惯于通过引用到常量(以及任何其他复制起来并不便宜的对象)来传递字符串。

    在某些情况下,最好按值传递,即使(或特别是)副本很昂贵(例如,当使用复制和交换实现 operator = 时)。但是这些很少见,只要你不能自己决定什么是合适的,你最好总是通过引用到常量传递而不是总是通过值传递。

    【讨论】:

      【解决方案4】:

      inline 关键字有 very little 与生成代码的内联有关。 inline 关键字表示该函数被内联声明(即在其声明中定义),因此在多个编译单元中可能有重复的定义。当您想在头文件中定义函数时需要它,因为此函数定义可能包含在多个编译单元中,并且如果没有 inline 关键字,这将违反单一定义规则。

      如果您担心性能,请在代码运行时对其进行分析,而不是让不知道您的代码在做什么的人猜测您的瓶颈在哪里。

      【讨论】:

      【解决方案5】:

      如果您没有花费大量时间生成输出,那么无论如何这都无关紧要。如果您已经对您的程序进行了概要分析并确定您处于程序花费大部分时间生成输出的异常情况,那么您可以开始考虑如何使此代码更快。您可能不会通过添加 inline 关键字来使其更快,因为您的编译器可能已经内联了该函数,如果不是,即使您要求它也可能不会这样做(尽管它可能)。

      真正让你的代码更快的一个简单的第一步是让你的字符串参数变成一个 const string& 。这样你就不会复制字符串。更复杂的第二步是使用 C 输出 API 而不是 C++ 流。根据我的经验,C API 的速度要快得多,这得到了 herehere 的支持。但是,除非您确定确实确实需要基于分析的性能,否则我不建议您迁移到 C API。

      【讨论】:

      • ostream::write 函数通常也很快。据我所见,iostream 的大部分缓慢源于频繁使用语言环境。这可以通过不使用“花式”流插入运算符并直接调用 ostream::write 来避免。
      【解决方案6】:

      一种优化以拥有 const-reference 的方法:

      void TheClass::displayString(cosnt string& str){ cout << str; }
      

      【讨论】:

        【解决方案7】:

        Softnux,你为什么不简单地创建一个基准?创建一个重复一百万次的for 循环,看看每个选项需要多少时间。然后分别为 Debug 和 Release 构建执行基准测试。现代编译器应该弄清楚什么时候内联或循环展开是更好的选择。

        编辑:尝试使用字符串流。输出到控制台将成为这里的瓶颈,而不是函数调用本身。

        【讨论】:

          猜你喜欢
          • 2015-12-08
          • 2021-11-28
          • 1970-01-01
          • 2021-10-06
          • 2014-03-29
          • 1970-01-01
          • 2017-01-05
          • 1970-01-01
          • 2021-01-17
          相关资源
          最近更新 更多