Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Printing to the console vs writing to a file (speed)

Tags:

c++

In C++, which would be faster if repeated, say, 5000 times:

cout << "text!" << endl;

or

my_text_file << "text!" << endl;

(writing to a file vs. cout-ing to the console)

Edit:

I ask because when writing to the console, you see all the text being printed which seems like it would slow down the loop. In a file, you arn't seeing the text being printed, which seems as if it would take less time.

Just tested it:

Console: > 2000 ms using endl and \n

File: 40 ms with endl and 4 ms with \n

like image 900
Christian Avatar asked Jun 14 '11 03:06

Christian


2 Answers

Writing to a file would be much faster. This is especially true since you are flushing the buffer after every line with endl.

On a side note, you could speed the printing significantly by doing repeating cout << "text!\n"; 5000 times, then flushing the buffer using flush().

like image 200
Dominic Gurto Avatar answered Sep 20 '22 19:09

Dominic Gurto


It's not that much faster...

A test of 1 million couts with endl (clear buffer):

Results:

console cout time: 2.87001
file cout time: 2.33776

Code:

class Timer
{
        struct timespec startTime, endTime;
        double sec;
public:
        void start();
        void stop();
        double getSec();
};

void Timer::start()
{
        clock_gettime(CLOCK_MONOTONIC, &startTime);
}
void Timer::stop()
{
        clock_gettime(CLOCK_MONOTONIC, &endTime);
        sec = (endTime.tv_sec - startTime.tv_sec);
        sec += (endTime.tv_nsec - startTime.tv_nsec) / 1000000000.0;
}
double Timer::getSec()
{
        return sec;
}


int main(){
        int ntests = 1000000;
        Timer t1 = Timer(), t2 = Timer();

        t1.start();
        for(int c=0;c<ntests;c++)
        {
                cout << "0" << endl;
        }
        t1.stop();

        ofstream out("out.txt");
        streambuf *coutbuf = cout.rdbuf();
        cout.rdbuf(out.rdbuf());
        t2.start();
        for(int c=0;c<ntests;c++)
        {
                cout << "0" << endl;
        }
        t2.stop();
        cout.rdbuf(coutbuf);

        cout << "console cout time: " << t1.getSec() << endl;
        cout << "file cout time: " << t2.getSec() << endl;
}

Build and run:

g++ test.cpp -o test -lrt && ./test && rm out.txt
like image 35
Jason Avatar answered Sep 18 '22 19:09

Jason