首页 > 解决方案 > 如何在 C++ 中增加 rdbuf 使用的缓冲区大小

问题描述

我正在使用下面的 c++ 代码将文件(大小约为 1.5-2 gb)从一个位置复制到另一个位置。

#include <fstream>

int main()
{
    std::ifstream  src("source_path/file.mp4", std::ios::binary);
    std::ofstream  dst("destination_path/fileCopy.mp4",   std::ios::binary);

    dst << src.rdbuf();
}

我已从此处获取此代码以理智、安全和有效的方式复制文件

此代码将文件从源复制到目标大约需要 45 秒。我知道这里rdbuf必须有一些与之相关的缓冲区大小,实际上我想增加缓冲区大小以获得更好的性能,如何增加缓冲区?

标签: c++fstream

解决方案


这是我用来将读取性能提高约 1.8 倍的方法:

// Open file for binary read.
ifstream in_file(file_name, ios::binary | ios::in);
// Proceed if file was successfully opened.
if (in_file.is_open()) {
    // Tried buffer size for 16 transfers. Seems a bit slower than 64.
    //const size_t bufsize = max(4096, 2 << (int32_t)log2(block_size >> 4));
    // Set buffer size for 64 transfers.
    const size_t bufsize = max(4096, 2 << (int32_t)log2(block_sizes[0] >> 6));
    auto buf = make_unique<char[]>(bufsize);
    in_file.rdbuf()->pubsetbuf(buf.get(), bufsize);
    // Create block for holding lines.
    auto lmemblock = make_unique<char[]>(block_sizes[i]);
    // Move file pointer to start of block.
    in_file.seekg(offsets[i]);
    // Read memblock of data into memory.
    in_file.read(lmemblock.get(), block_sizes[i]);

关键是in_file.rdbuf()->pubsetbuf(buf.get(), bufsize);这增大了默认缓冲区大小,就我而言,这显着提高了性能。


推荐阅读