打印到控制台vs写入文件(速度)

时间:2011-06-14 03:42:22

标签: c++

在C ++中,如果重复会更快,比如5000次:

cout << "text!" << endl;

my_text_file << "text!" << endl;

(写入文件与cout-ing到控制台)

编辑:

我问,因为在写入控制台时,您会看到所有正在打印的文本,这似乎会减慢循环速度。在文件中,您没有看到正在打印的文本,这似乎需要更少的时间。

刚试过它:

控制台:&gt;使用endl和\ n

2000毫秒

文件:endl为40 ms,\ n

为4 ms

4 个答案:

答案 0 :(得分:13)

写入文件会快得多。这是特别正确的,因为您在使用endl的每一行之后刷新缓冲区。

另外,您可以通过重复cout << "text!\n"; 5000次,然后使用flush()刷新缓冲区来显着加快打印速度。

答案 1 :(得分:1)

使用相同的缓冲区大小向控制台写入相同数量的数据肯定比写入文件更快。

你可以通过不用每一行写出缓冲区来加快你的写入速度(控制台输出和文件输出)(即 - 不要在每一行之后使用std :: endl,因为它们都添加了一个endline到流,并写入缓冲区)。而是使用“\ n”,除非您需要确保缓冲区由于某种原因输出。

答案 2 :(得分:1)

它的速度不是那么快......

使用endl(清除缓冲区)对1 million couts进行测试:

结果:

console cout time: 2.87001
file cout time: 2.33776

代码:

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;
}

构建并运行:

g++ test.cpp -o test -lrt && ./test && rm out.txt

答案 3 :(得分:0)

除了控制台I / O通常相对较慢之外,标准流coutcin的默认配置还存在一些问题,如果不纠正这些问题会大大降低性能。

原因是标准规定,默认情况下,C ++ iostream库中的coutcin应与C stdio库中的stdoutstdin一起使用以预期的方式。

这基本上意味着coutcin在其内部streambuf中根本无法进行任何缓冲,并且基本上将所有I / O操作转发到C库。< / p>

如果您想使用标准流执行类似高性能I / O的任何操作,则需要使用

关闭此同步
std::ios_base::sync_with_stdio(false);

在进行任何I / O之前。