gpt4 book ai didi

c++ - std::fstream 缓冲与手动缓冲(为什么手动缓冲有 10 倍增益)?

转载 作者:IT老高 更新时间:2023-10-28 13:59:02 26 4
gpt4 key购买 nike

我测试了两种书写配置:

  1. Fstream 缓冲:

    // Initialization
    const unsigned int length = 8192;
    char buffer[length];
    std::ofstream stream;
    stream.rdbuf()->pubsetbuf(buffer, length);
    stream.open("test.dat", std::ios::binary | std::ios::trunc)

    // To write I use :
    stream.write(reinterpret_cast<char*>(&x), sizeof(x));
  2. 手动缓冲:

    // Initialization
    const unsigned int length = 8192;
    char buffer[length];
    std::ofstream stream("test.dat", std::ios::binary | std::ios::trunc);

    // Then I put manually the data in the buffer

    // To write I use :
    stream.write(buffer, length);

我期待同样的结果...

但是我的手动缓冲将性能提高了 10 倍以写入 100MB 的文件,并且 fstream 缓冲与正常情况相比没有任何改变(没有重新定义缓冲区)。

有人对这种情况有解释吗?

编辑:这是新闻:刚刚在 super 计算机上完成的基准测试(Linux 64 位架构,持续英特尔至强 8 核,Lustre 文件系统和......希望配置良好的编译器) benchmark(而且我没有解释 1kB 手动缓冲区“共振”的原因......)

编辑 2:以及 1024 B 的共振(如果有人对此有想法,我很感兴趣): enter image description here

最佳答案

这基本上是由于函数调用开销和间接性造成的。 ofstream::write() 方法继承自 ostream。该函数未内联在 libstdc++ 中,这是开销的第一个来源。然后 ostream::write() 必须调用 rdbuf()->sputn() 来进行实际的写入,这是一个虚函数调用。

最重要的是,libstdc++ 将 sputn() 重定向到另一个虚函数 xsputn(),它添加了另一个虚函数调用。

如果您自己将字符放入缓冲区,则可以避免这种开销。

关于c++ - std::fstream 缓冲与手动缓冲(为什么手动缓冲有 10 倍增益)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12997131/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com