printf vs cout performance

时间:2015-10-22 02:47:54

标签: c++ windows

void perfprint(unsigned int count)
{
    char a[100] = "fosjkdfjlsjdflw0304802";
    for(unsigned int i = 0;i<count;++i)
    {
        printf("%s", a);
    }
}

void perfcout(unsigned int count)
{
    char a[100] = "fosjkdfjlsjdflw0304802";
    for(unsigned int i = 0;i<count;++i)
    {
        cout << a;
    }
}

环境:C ++,VS 2010,Windows 7,32位,Core-i7,4GB,3.40 GHz

我使用count = 10000测试了两个函数,每个5次。 使用QueryPerformanceCounter测量效果。

perfprint&gt; ~850毫秒(平均5次运行)

perfcout&gt; ~9000毫秒(平均5次运行)

这是否意味着printf比cout

更快~10x

修改

使用/ Ox,/ Ot,Release build中没有调试信息

并在perfcout方法中使用std::ios_base::sync_with_stdio(false);cout的结果相同,即~9000 millisecs

编辑2:

总而言之,coutprintf更快。上述观察的原因是由于控制台输出。当将输出重定向到文件时,事情开始转向!

1 个答案:

答案 0 :(得分:5)

我没有安装VS 2010,但是我对VS 2013和2015进行了快速测试。我稍微修改了你的代码以减少重复,并包含时序代码,这样做:

#include <iostream>
#include <cstdio>
#include <chrono>
#include <string>

template <class F>
int perf(F f) {
    using namespace std::chrono;

    const int count = 1000000;
    char a[100] = "fosjkdfjlsjdflw0304802";

    auto start = high_resolution_clock::now();
    for (unsigned i = 0; i < count; i++)
        f(a);
    auto end = high_resolution_clock::now();

    return duration_cast<milliseconds>(end - start).count();
}

int main() {
    std::cerr << "cout: " << perf([](char const *a) { std::cout << a; }) << "\n";
    std::cerr << "printf: " << perf([](char const *a) { printf("%s", a); }) << "\n";
}

关闭优化功能后,cout显示速度稍快一些(例如,358 ms与printf相比为460),但关闭优化后的测量速度毫无意义。

优化开启cout赢得更大的保证金(191毫秒vs printf 365毫秒)。

为了保持这些意义,我将它们全部运行,并将输出重定向到文件。没有它,基本上所有你测量的都是控制台驱动程序的速度,这基本上没有意义且毫无价值。