c++ - 如何在 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
必须有一些与之相关的缓冲区大小,实际上我想增加缓冲区大小以获得更好的性能,如何增加缓冲区?
解决方案
这是我用来将读取性能提高约 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);
这增大了默认缓冲区大小,就我而言,这显着提高了性能。
推荐阅读
- r - 如何用R中的样本组制作特定行的箱线图
- javascript - exceljs拼接合并
- swift - 协议指定关联类型
- c++ - 如何在 CLR 空项目(.NET Framework)中实现多线程?
- alexa - 如何以编程方式从我的服务器链接 Alexa Skill 的帐户
- c# - 精灵索引似乎没有更新
- python - 如何使用检查点以外的火炬保存加载方法将 ray rllib pytorch 整个模型导入下一轮训练和后续推理
- c# - 如何在 C# 中更新类属性的值?
- gstreamer - 链接 gstreamer tutorial4 会产生错误
- svelte - 使用弹簧值更新的常量变量