簡體   English   中英

printf 與 cout 性能

[英]printf vs cout performance

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-bit, Core-i7, 4GB, 3.40 GHz

我用count = 10000測試了這兩個函數,每個函數5次。 使用QueryPerformanceCounter測量性能。

perfprint > ~850毫秒(平均 5 次運行)

perfcout > ~9000毫秒(平均 5 次運行)

這是否意味着printfcout~10x

編輯:

使用 /Ox、/Ot,在發布版本中沒有調試信息

std::ios_base::sync_with_stdio(false); perfcout方法中,結果與cout相同,即~9000 millisecs

編輯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 毫秒)。

為了使這些有意義,我將它們全部運行,並將輸出重定向到一個文件。 沒有它,基本上你要測量的只是控制台驅動程序的速度,這基本上毫無意義和價值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM