2015-07-20 61 views
3

我想比较printf()的COUT速度在C++中使用COUT此代码: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++) 
    printf("Hello!"); 
} 

我跑两个程序多次,这是结果(用克++编译器):

COUT:17.116s

的printf():9.153

所以打印()COUT快两倍。我搜索在计算器对这种行为背后的原因,我发现打印()快于COUT因为它的一个功能,而COUT是一个对象。但我也了解到,cout比较慢,因为它与标准C流同步。

因此,我所做其次是其相应的标准C关闭同步所有的iostream标准流的流使用此代码:

#include <iostream> 

#include <ios> 

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

令人奇怪的是,这是我得到了什么:

printf()的:9.153

COUT与同步:17.116s

cout同步关闭:1.146s

WOW!这是一个巨大的差异!

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

在此先感谢。

+2

为打印到标准输出你的程序的主要部分?那么是的,这可能是一个好主意, –

+5

“这将是一个很好的做法*总是* ...”。不,不管问题如何结束,永远不会有一个解决方案总是*正确的。 – kay

+1

一些评论:这样的时间很大程度上取决于1)标准输出插入到2)平台3)标准库实现。此外,您并不总是有选择关闭同步(例如,它必须在程序的开始处完成)。与C流同步也是一个很好的功能,特别是如果您调用执行IO的C库时。 –

回答

0

这取决于您是否期望输出的顺序与否。如果你使用输出流来混合C风格或其他输出。 你不想总是关闭同步。

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

  1. 您正在混合Cout与其他流输出功能。 (cin/cout ...)[1]

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

其他明智的,它一般是罚款,关闭同步。

还看到: http://en.cppreference.com/w/cpp/io/ios_base/sync_with_stdio