为什么C++中的缓冲很重要?

Amu*_*umu 18 c++ buffer

我试图打印"Hello World"200,000次,它让我永远,所以我必须停下来.但是在我添加一个char数组作为缓冲区后,它花了不到10秒.为什么?

在添加缓冲区之前:

#include <iostream> 
using namespace std;

int main() {
        int count = 0;
        std::ios_base::sync_with_stdio(false);
        for(int i = 1; i < 200000; i++)
        {       
                cout << "Hello world!\n";
                count++;
        }
                cout<<"Count:%d\n"<<count;
return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是在添加缓冲区之后:

#include <iostream> 
using namespace std;

int main() {
        int count = 0;
        std::ios_base::sync_with_stdio(false);
        char buffer[1024];
        cout.rdbuf()->pubsetbuf(buffer, 1024);
        for(int i = 1; i < 200000; i++)
        {       
                cout << "Hello world!\n";
                count++;
        }
                cout<<"Count:%d\n"<<count;
return 0;
}
Run Code Online (Sandbox Code Playgroud)

这让我想起了Java.使用BufferReader读取文件有什么好处?

mau*_*ris 24

对于文件操作的立场,写入内存(RAM)总是比直接写入磁盘上的文件更快.

为了说明,我们定义:

  • 每个写IO操作到磁盘上的文件花费1毫秒
  • 每次通过网络写入IO操作到磁盘上的文件的成本为5毫秒
  • 每次写IO操作到内存的成本为0.5毫秒

假设我们必须将一些数据写入文件100次.

案例1:直接写入磁盘上的文件

100 times x 1 ms = 100 ms
Run Code Online (Sandbox Code Playgroud)

案例2:通过网络直接写入磁盘上的文件

100 times x 5 ms = 500 ms
Run Code Online (Sandbox Code Playgroud)

案例3:在写入磁盘上的文件之前在内存中缓冲

(100 times x 0.5 ms) + 1 ms = 51 ms
Run Code Online (Sandbox Code Playgroud)

案例4:在通过网络写入磁盘上的文件之前在内存中缓冲

(100 times x 0.5 ms) + 5 ms = 55 ms
Run Code Online (Sandbox Code Playgroud)

结论

内存缓冲总是比直接操作更快.但是,如果您的系统内存不足并且必须与页面文件交换,那么它将再次变慢.因此,您必须在内存和磁盘/网络之间平衡IO操作.

  • 这就像把汽车从一个城市搬到另一个城市.如果你一次移动一个盒子,你将花费大量时间开车.你想要一次至少搬运一辆车.随着每次通话的大小增加,首先性能和效率显着提高.然后你达到了收益递减点.这一点取决于很多因素,但通常约为2KB左右."你好,世界!" 是不到2KB. (8认同)

Mat*_* M. 5

写入磁盘的主要问题是写入时间不是字节数的线性函数,而是一个具有巨大常数的仿射函数。

在计算方面,这意味着对于 IO,您具有良好的吞吐量(低于内存,但仍然相当不错),但延迟很差(比正常网络稍好一些)。

如果您查看 HDD 或 SSD 的评测文章,您会发现读/写测试分为两类:

  • 随机读取的吞吐量
  • 连续读取的吞吐量

后者通常明显大于前者。

通常,操作系统和 IO 库应该为您抽象这一点,但正如您所注意到的,如果您的例程是 IO 密集型,您可能会通过增加缓冲区大小来获得收益。这是正常的,该库通常是为各种用途量身定制的,因此为普通应用程序提供了良好的中间立场。如果您的应用程序不是“平均”,那么它的执行速度可能不会那么快。