【问题标题】:cout speed when synchronization is off同步关闭时的 cout 速度
【发布时间】:2015-10-10 01:15:05
【问题描述】:

我想比较printfcout在C++中的速度,使用cout的代码:

#include <iostream>

int main()
{
    for (int i = 0; i < 150000; i++)
        std::cout << "Hello!";
}

这个代码是printf:

#include <cstdio>

int main()
{
    for (int i = 0; i < 150000; i++)
        std::printf("Hello!");
}

我多次运行这两个程序,结果如下(使用 g++ 编译器):

cout:17.116 秒

printf:9.153 秒

所以printfcout 快两倍。我在 Stack Overflow 中搜索了这种行为背后的原因,我发现 printfcout 快,因为它是一个函数,而 cout 是一个对象。但我也了解到cout 速度较慢,因为它与标准 C 流同步。

所以我接下来要做的是使用以下代码关闭所有 iostream 标准流与其对应的标准 C 流的同步:

#include <iostream>

int main()
{
    std::ios_base::sync_with_stdio(false);
    for (int i = 0; i < 150000; ++i)
        std::cout << "Hello!";
}

令人惊讶的是,这就是我得到的:

printf:9.153 秒

cout 同步开启:17.116 秒

cout 同步关闭:1.146 秒

哇!差别很大!

所以我的问题是:总是关闭同步是一个好习惯吗?

提前致谢。

【问题讨论】:

  • 打印到标准输出是程序的主要部分吗?那么是的,这可能是个好主意,
  • 总是……会是一个好习惯吗?”。不,无论问题如何结束,都没有一个总是正确的解决方案。
  • 一些 cmets :这样的时间在很大程度上取决于 1) 标准输出插入到什么 2) 平台 3) 标准库实现。此外,您并不总是可以选择关闭同步(例如,必须在程序开始时完成)。与 C 流同步也是一个很好的特性,尤其是当你调用 C 库执行 IO 时。
  • 仅供参考,如果您关闭同步,则 cout 不再是线程安全的。
  • " 发现 print() 比 cout 快,因为它是一个函数,而 cout 是一个对象。” 如果您能链接到 SO 上的位置,我将不胜感激你已经读过了。听起来很……令人惊讶。您是否还进行了优化编译?哪个编译器,平台?

标签: c++ c++11


【解决方案1】:

这取决于您是否期望输出必须按顺序排列。如果您使用输出流混合 C 风格或其他输出。 您不想总是关闭同步。

你不想在什么时候关闭它。

  1. 您正在将 Cout 与其他流输出函数混合使用。比如,scanf/printf、gets/puts、getchar/putchar ...) 与 C++ 风格的 IO (cin/cout ...)[1]

  2. 您正在使用带有输出的线程,您希望得到良好的输出。 “同时访问同步流(即,此函数返回 true 的流)永远不会引入数据竞争:字符是单独读取/写入的,尽管没有进一步保证线程之间的顺序。这可能导致线程之间的字符交错,除非正确同步整个操作由程序强制执行。"[1]

否则,关闭同步通常没问题。

另见: http://en.cppreference.com/w/cpp/io/ios_base/sync_with_stdio

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 2014-09-23
    • 1970-01-01
    • 2013-09-23
    相关资源
    最近更新 更多