如何在不刷新缓冲区的情况下打印换行符?

use*_*899 7 c++

我正在尝试用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倍.但是我想知道如何将所有值存储在缓冲区中并一次刷新所有值,而不是每次充满时都让它冲洗,所以我有几个问题:

  1. 是否可以在不刷新缓冲区的情况下打印换行符?
  2. 如何更改缓冲区大小以便我可以将所有值存储在其中并在最后刷新它?
  3. 这种输出文字的方法是否愚蠢?如果是这样,为什么,以及什么是更好的替代品呢?

编辑:似乎我的结果偏向于滞后系统(智能手机的终端应用程序).​​.....使用更快的系统,执行时间没有显着差异.

Jay*_*iya 6

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如上),由于数据只是陷入黑洞,因此​​刷新似乎没有效果。