【问题标题】:Speed of output输出速度
【发布时间】:2012-11-13 03:07:53
【问题描述】:

我正在使用 C++ 进行编码。 让我们成为一些字符串。我被要求确定以下哪个更快:

cout << "s:"  + s  + "s:"  + s  + " s:"  + s  + "\n";

cout << "s:" << s << "s:" << s << " s:" << s << "\n";

我反复运行它们,发现第二个更快。我花了一段时间试图找出原因。我认为这是因为在第一个中,首先连接字符串然后输出到屏幕。但是第二个只是直接输出到屏幕上。对吗?

【问题讨论】:

标签: c++ output


【解决方案1】:

第一个可能涉及为字符串连接分配一些内存,然后将最终连接的字符串复制到输出缓冲区。第二个将简单地将已分配的字符串数据复制到已分配的输出缓冲区。

【讨论】:

    【解决方案2】:

    从理论的角度来看,第二个例子是线性时间,而第一个例子可以是二次时间(子串的数量),具体取决于实现。

    要确定您的实现是否属于这种情况,您必须查看源代码和(因为编译器可能会优化)机器代码。

    简而言之,原因取决于实现,通常,要确定“哪个最快”,您别无选择,只能MEASURE。 “原因”可以作为启发式指南。但仅此而已:最终,衡量标准和现实才是最重要的。

    【讨论】:

    • 这不仅仅是可测量的,它可以在代码中证明,stdout 在连接字符串时不会遇到缓冲区创建的约束。
    • @Michael:不清楚你的意思是“可证明的”,但几乎没有什么可以从源代码证明。 OP的问题。特别是,某些具有某些选项的 C++ 编译器会优化字符串连接,并且对于某些库实现,每次调用 &lt;&lt; 都会消耗性能。所以一般来说你只需要测量。
    【解决方案3】:

    您认为由于第一个创建字符串对象而导致第二个更快的假设可能是正确的。这里的关键是“可能”。这些是标准库函数,因此可以具有不同的实现细节,因为标准定义了行为而不是如何实现。理论上,您可以找到一个与您的发现相反的标准库实现。

    【讨论】:

    • 你不认为在每个 + 上创建缓冲区的低效率在 std 库中是真实存在的吗?
    • 是的,但是您认为可以编写一个效率极低的流运算符吗?关键是不能保证。它依赖于实现,因此你不能说#1总是比 #2 快。
    【解决方案4】:

    我认为您想查看上一个问题的答案以获得完整的文章:Efficient string concatenation in C++

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多