我正在尝试用c ++试图找出如何尽可能快地打印从0到n的数字.
起初我只是用循环打印所有数字:
for (int i = 0; i < n; i++)
{
std::cout << i << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
但是,我认为这会在输出的每一个数字之后刷新缓冲区,而且肯定需要一些时间,所以我试图先将所有数字打印到缓冲区(或实际上直到它已满,因为它似乎似乎自动刷新)然后立即冲洗它们.然而,似乎在刷新缓冲区之后打印\n就像std :: endl一样,所以我省略了它:
for (int i = 0; i < n; i++)
{
std::cout << i << ' ';
}
std::cout << std::endl;
Run Code Online (Sandbox Code Playgroud)
这似乎比第一个例子快10倍.但是我想知道如何将所有值存储在缓冲区中并一次刷新所有值,而不是每次充满时都让它冲洗,所以我有几个问题:
编辑:似乎我的结果偏向于滞后系统(智能手机的终端应用程序)......使用更快的系统,执行时间没有显着差异.
TL;DR:一般来说,使用'\n'而不是std::endl更快,因为std::endl
解释:
std::endl导致缓冲区刷新,而'\n'不会。但是,您可能会也可能不会注意到任何加速,这取决于您应用的测试方法。
考虑以下测试文件:
结束l.cpp:
#include <iostream>
int main() {
for ( int i = 0 ; i < 1000000 ; i++ ) {
std::cout << i << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
斜线.cpp:
#include <iostream>
int main() {
for ( int i = 0 ; i < 1000000 ; i++ ) {
std::cout << i << '\n';
}
}
Run Code Online (Sandbox Code Playgroud)
这两个都是g++在我的 linux 系统上编译使用的,并经过以下测试:
1. time ./a.out
对于 endl.cpp,它需要 19.415s。
对于 slashn.cpp,它需要 19.312s。
2. time ./a.out >/dev/null
对于 endl.cpp,它需要 0.397s
对于 slashn.cpp,它需要 0.153s
3. time ./a.out >temp
endl.cpp 需要 2.255s
slashn.cpp 需要 0.165s
结论: '\n'肯定更快(甚至实际上),但速度的差异可能取决于其他因素。在终端窗口的情况下,限制因素似乎取决于终端本身显示文本的速度。由于文本显示在屏幕上,并且需要发生自动滚动等,因此执行过程中会出现大量减速。另一方面,对于普通文件(如temp上面的示例),刷新缓冲区的速率对其影响很大。对于某些特殊文件(/dev/null如上),由于数据只是陷入黑洞,因此刷新似乎没有效果。