在C中,如果重复会更快,比如5000次:
cout << "text!" << endl;
要么
my_text_file << "text!" << endl;
(写入文件与cout到控制台)
编辑:
我问,因为在写入控制台时,您会看到所有正在打印的文本,这似乎会减慢循环速度 . 在文件中,您没有看到正在打印的文本,这似乎需要更少的时间 .
刚试过它:
控制台:> 2000毫秒使用endl和\ n
文件:endl为40 ms,\ n为4 ms
写入文件会快得多 . 这是特别正确的,因为您在使用 endl 的每一行之后刷新缓冲区 .
endl
另外,通过重复 cout << "text!\n"; 5000次,然后使用 flush() 刷新缓冲区,可以显着加快打印速度 .
cout << "text!\n";
flush()
使用相同的缓冲区大小向控制台写入相同数量的数据肯定比写入文件更快 .
你可以通过不用每一行写出缓冲区来加快你的写入速度(对于控制台输出和文件输出)(即 - 不要在每一行之后使用std :: endl,因为它们都为流添加了一个结束线,并写入缓冲区) . 而是使用“\ n”,除非您需要确保由于某种原因输出缓冲区 .
它的速度不是那么快......
使用endl(清除缓冲区)测试 1 million couts :
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
除了控制台I / O通常相对较慢之外,标准流 cout 和 cin 的默认配置存在一些问题,如果不纠正则会大大降低性能 .
cout
cin
原因是标准要求默认情况下,C iostream库中的 cout 和 cin 应该以预期的方式与C stdio库中的 stdout 和 stdin 一起工作 .
stdout
stdin
这基本上意味着 cout 和 cin 在其内部 streambuf 中根本不能进行任何缓冲,并且基本上将所有I / O操作转发到C库 .
streambuf
如果要使用标准流执行类似高性能I / O的任何操作,则需要关闭此同步
std::ios_base::sync_with_stdio(false);
在进行任何I / O之前 .
4 回答
写入文件会快得多 . 这是特别正确的,因为您在使用
endl
的每一行之后刷新缓冲区 .另外,通过重复
cout << "text!\n";
5000次,然后使用flush()
刷新缓冲区,可以显着加快打印速度 .使用相同的缓冲区大小向控制台写入相同数量的数据肯定比写入文件更快 .
你可以通过不用每一行写出缓冲区来加快你的写入速度(对于控制台输出和文件输出)(即 - 不要在每一行之后使用std :: endl,因为它们都为流添加了一个结束线,并写入缓冲区) . 而是使用“\ n”,除非您需要确保由于某种原因输出缓冲区 .
它的速度不是那么快......
使用endl(清除缓冲区)测试
1 million couts
:结果:
码:
构建并运行:
除了控制台I / O通常相对较慢之外,标准流
cout
和cin
的默认配置存在一些问题,如果不纠正则会大大降低性能 .原因是标准要求默认情况下,C iostream库中的
cout
和cin
应该以预期的方式与C stdio库中的stdout
和stdin
一起工作 .这基本上意味着
cout
和cin
在其内部streambuf
中根本不能进行任何缓冲,并且基本上将所有I / O操作转发到C库 .如果要使用标准流执行类似高性能I / O的任何操作,则需要关闭此同步
在进行任何I / O之前 .