c++ - printf 与 cout 性能

标签 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 > ~850 毫秒(5 次运行的平均值)

perfcout > ~9000 毫秒(5 次运行的平均值)

这是否意味着 printfcout~10 倍

编辑:

使用/Ox、/Ot,发布版本中没有调试信息

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

编辑 2:

总而言之,coutprintf 快。上述观察的原因是由于控制台输出。将输出重定向到文件时,事情发生了翻天覆地的变化!

最佳答案

我没有再安装 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 毫秒与 printf 的 460 毫秒相比),但在关闭优化的情况下测量速度是毫无意义的。

启用优化后 cout 以更大的优势获胜(191 毫秒对 printf 365 毫秒)。

为了保持这些有意义,我运行它们时将输出重定向到一个文件。如果没有它,基本上您要测量的只是控制台驱动程序的速度,这基本上是没有意义和值(value)的。

关于c++ - printf 与 cout 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33272586/

相关文章:

c++ - 告诉 `string::operator==` 从字符串的后面开始比较

c++ - C++ 程序中的 Lisp 解释器

python - PyObject_CallObject 在 bytearray 方法上失败

c++ - 如何处理查找函数中的 "item not found"情况?

python - 解压缩后无法删除压缩文件

c++ - _stdcall 中的可变参数,C++/内联 ASM

windows - Docker for Windows : volumes are empty

C++ - 知道类型/类是否嵌套?

c++ - 如何将 16 位整数写入文件?

windows - Powershell脚本在ISE上运行良好,但在cli上存在问题