15
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <ctime>

int main(int argc, char* argv[])
{
    std::clock_t start;
    double duration;    

    std::cout << "Starting std::cout test." << std::endl;
    start = std::clock();

    for (int i = 0; i < 1000; i++)
    {
        std::cout << "Hello, World! (" << i << ")" << std::endl;
    }

    duration = (std::clock() - start) / (double) CLOCKS_PER_SEC;

    std::cout << "Ending std::cout test." << std::endl;
    std::cout << "Time taken: " << duration << std::endl;

    std::system("pause");

    std::cout << "Starting std::printf test." << std::endl;
    start = std::clock();

    for (int i = 0; i < 1000; i++)
    {
        std::printf("Hello, World! (%i)\n", i);
        std::fflush(stdout);
    }

    duration = (std::clock() - start) / (double) CLOCKS_PER_SEC;

    std::cout << "Ending std::printf test." << std::endl;
    std::cout << "Time taken: " << duration << std::endl;

    system("pause");

    return 0;
}

さて、これが最初の5回の実行の時間です。

  • std :: coutテスト:1.125秒; printfテスト:0.195
  • std :: coutテスト:1.154秒; printfテスト:0.230
  • std :: coutテスト:1.142秒; printfテスト:0.216
  • std :: coutテスト:1.322秒; printfテスト:0.221
  • std :: coutテスト:1.108秒; printfテスト:0.232

ご覧のとおり、を使用printfしてからfflushingするのにかかる時間は、を使用する場合の約5分の1std::coutです。

std::coutの演算子を使用すると、おそらく少し遅くなる(ほとんど最小限になる)と予想してい<<ましたが、この大きな違いに備えることはできませんでした。私は公正なテストを行っていますか?もしそうなら、彼らが本質的にまったく同じことをするのであれば、最初のテストが2番目のテストよりもはるかに遅くなるのはなぜですか?

4

6 に答える 6

12

これを試して:

#include <cstdlib>
#include <cstdio>
#include <ctime>
#include <iostream>

int main(int argc, char* argv[])
{
#if defined(NOSYNC)
    std::cout.sync_with_stdio(false);
#endif

    std::cout << "Starting std::cout test." << std::endl;

    std::clock_t start = std::clock();

    for (int i = 0; i < 1000; i++)
    {   
        std::cout << "Hello, World! (" << i << ")" << std::endl;
    }   

    clock_t mid = std::clock();

    for (int i = 0; i < 1000; i++)
    {   
        std::printf("Hello, World! (%i)\n", i); 
        std::fflush(stdout);
    }   

    std::clock_t end = std::clock();

    std::cout << "Time taken: P1 " << ((mid-start)*1.0/CLOCKS_PER_SEC) << std::endl;

    std::cout << "Time taken: P2 " << ((end-mid)*1.0/CLOCKS_PER_SEC) << std::endl;


    return 0;
}

それから私は得る:

> g++ -O3 t13.cpp
> ./a.out
# lots of lines deleted
Time taken: P1 0.002517
Time taken: P2 0.001872

> g++ -O3 t13.cpp -DNOSYNC   
> ./a.out
# lots of lines deleted
Time taken: P1 0.002398
Time taken: P2 0.001878

したがって、P2時間は変更されません。
ただし、を使用すると、P1回(つまり、std :: cout)が改善されますstd::cout.sync_with_stdio(false);。コードが2つのストリーム(std :: cout stdout)の同期を維持しようとしなくなったためです。純粋なC++を作成していて、std :: coutのみを使用している場合は、問題ありません。

于 2012-08-20T21:33:01.870 に答える
10

真のリンゴとリンゴを比較するには、テストを書き直して、テストケース間で変更されるのは、使用されている印刷関数だけになるようにします。

int main(int argc, char* argv[])
{
    const char* teststring = "Test output string\n";
    std::clock_t start;
    double duration;

    std::cout << "Starting std::cout test." << std::endl;
    start = std::clock();

    for (int i = 0; i < 1000; i++)
        std::cout << teststring;
    /* Display timing results, code trimmed for brevity */

    for (int i = 0; i < 1000; i++) {
        std::printf(teststring);
        std::fflush(stdout);
    }
    /* Display timing results, code trimmed for brevity */
    return 0;
}

printfこれで、とcout関数呼び出しの違いだけをテストすることになります。複数回の呼び出しなどによる違いはありません<<。これを試してみると、結果が大きく異なるのではないかと思います。

于 2012-08-20T20:45:36.957 に答える
4

使用する

cout << "\n";

バッファリングを防ぐため。はるかに高速

于 2017-04-28T14:37:18.773 に答える
2

約10年前、ScottMeyersはiostreamscanf/printfの効率をテストしました。コンパイラと環境によっては、scanf / printfがiostreamより20%速い場合もあれば、200%速い場合もあります。しかし、iostreamはscanf/printfよりも高速ではありませんでした。他の2つの例によると、scanf/printfはiostreamよりも高速です。しかし、マイヤーズ氏は「本当に便利なプログラムでは、違いはないだろう」と語った。Googleのプログラミングスタイル([ http://google-styleguide.googlecode.com/svn/trunk/cppguide.html])によると、ログを除いてストリームを使用しないでください。iostreamの代わりに、scanf/printfを自分でカプセル化することもできます。

于 2017-04-28T14:59:39.243 に答える
0

私は1台のコンピューターのプログラミング範囲しかないので、あまりテストしていません。とにかく、std :: coutは、正確な詳細コードを使用したビルドではるかに高速です。私はCpp14を使用しています。

特定の人がC++を選ぶと思います。はい、Cは優れた言語ですが、論理的には、printfがstdcoutよりも高速であるかどうかはわかりません。Printfは、実行時にvoidポインタから型変換を行う必要があります。Coutはコンパイル時にそれを行います。

于 2018-05-22T02:22:08.107 に答える
0

このテストは、Windows 10、WSL Ubuntu、CLion 2018、GCCを実行しているラップトップで試しました。最適化なし:

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <ctime>

int main(int argc, char *argv[]) {
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::clock_t start;
    double duration1, duration2;

    std::cout << "Starting std::cout test.\n";
    start = std::clock();

    for (int i = 0; i < 100000; i++) {
        std::cout << "Hello, World! (" << i << ")" << std::endl;
    }

    duration1 = (std::clock() - start) / (double) CLOCKS_PER_SEC;

    std::cout << "Starting std::printf test.\n";
    start = std::clock();

    for (int i = 0; i < 100000; i++) {
        std::printf("Hello, World! (%i)\n", i);
        std::fflush(stdout);
    }

    duration2 = (std::clock() - start) / (double) CLOCKS_PER_SEC;

    std::cout << "Time taken: cout " << duration1 << std::endl;
    std::cout << "Time taken Printf: " << duration2 << std::endl;

    return 0;
}

結果:

Test1: Cout: 2.25, Printf: 2.45312  (Cout run first)
Test2: Cout: 2.42188, Printf: 2.07812 (Printf Run first)
Test3: Cout: 2.26562, Printf: 2.25 (Cout run first)
Test4: Cout 2.46875, Printf: 2.57812 (Printf run first)

TL; DR:両方の機能を使用std::ios_base::sync_with_stdio(false)std::cin.tie(nullptr)てほぼ同じスタンドに持ち込みます。

于 2019-03-23T22:00:44.247 に答える