C++ cout printing slowly

前端 未结 8 2051
情深已故
情深已故 2020-11-30 14:23

I noticed if I print out a long string(char*) using cout it seems to print 1 character at a time to the screen in Windows 7, Vista, and Linux(using putty) using Visual C++ 2

8条回答
  •  醉梦人生
    2020-11-30 14:52

    You should try to write all your data to an ostringstream first, and then use cout on the ostringstream's str(). I am on 64-bit Windows 7 and Test1 was already significantly faster than Test2 (your mileage may vary). Using an ostringstream to build a single string first and then using cout on that further decreased Test1's execution time by a factor of about 3 to 4. Be sure to #include .

    I.e., replace

    void Test1()
    {
        cout
            << "a:" << a << "\n"
            << "a:" << setfill('0') << setw(8) << a << "\n"
            << "b:" << b << "\n"
            << "c:" << c << "\n"
            << "d:" << d << "\n"
            << "e:" << e << "\n"
            << "f:" << setprecision(6) << f << "\n"
            << "g:" << setprecision(10) << g << endl;
    }
    

    with:

    void Test1()
    {
        ostringstream oss;
        oss
            << "a:" << a << "\n"
            << "a:" << setfill('0') << setw(8) << a << "\n"
            << "b:" << b << "\n"
            << "c:" << c << "\n"
            << "d:" << d << "\n"
            << "e:" << e << "\n"
            << "f:" << setprecision(6) << f << "\n"
            << "g:" << setprecision(10) << g << endl;
        cout << oss.str();
    }
    

    I suspect ostringstream makes this so much faster as a result of not trying to write to the screen each time you call operator<< on cout. I've also noticed through experience that reducing the number of times you write to the screen (by writing more at once) increases performance (again, your mileage may vary).

    E.g.,

    void Foo1()
    {
        for(int i = 0; i < 10000; ++i) {
            cout << "Foo1\n";
        }
    }
    
    void Foo2()
    {
        std::string s;
        for(int i = 0; i < 10000; ++i) {
            s += "Foo2\n";
        }
        cout << s;
    }
    
    void Foo3()
    {
        std::ostringstream oss;
        for(int i = 0; i < 10000; ++i) {
            oss << "Foo3\n";
        }
        cout << oss.str();
    }
    

    In my case, Foo1 took 1,092ms, Foo2 took 234ms, and Foo3 took 218ms. ostingstreams are your friend. Obviously Foo2 and Foo3 require (trivially) more memory. To compare this against a C-style function, try sprintf into a buffer and then write that buffer using fprintf and you should see still more efficiency over Test2 (though for me this only improved performance of Test2 by about 10% or so; cout and printf are indeed different beasts under the hood).

    Compiler: MinGW64 (TDM and its bundled libraries).

提交回复
热议问题