You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于现代C++生成1GB任意二进制文件的最快方法

优化大文件写入性能的现代C++20实现

你的代码性能瓶颈完全在于逐字符的文件写入方式——单字符输出会触发大量内部缓冲区操作和系统调用,完全没利用NVMe固态硬盘的连续写入能力。以下是兼顾可读性与极致性能的优化方案:

优化后的代码

#include <fstream>
#include <vector>
#include <cstdint>

int main() {
    constexpr uint64_t size = 1ULL * 1000 * 1000 * 1000;
    std::vector<char> data(size, 'a');

    // 以二进制模式打开文件,关闭C标准IO同步,消除额外开销
    std::ofstream myfile("test.dat", std::ios::binary | std::ios::out);
    myfile.sync_with_stdio(false);

    // 设置大尺寸缓冲区(64MB,可根据内存调整),减少内核态/用户态切换
    constexpr std::streamsize buf_size = 64 * 1024 * 1024;
    char* buf = new char[buf_size];
    myfile.rdbuf()->pubsetbuf(buf, buf_size);

    // 一次性写入整个连续内存块,最大化磁盘连续写入效率
    myfile.write(data.data(), data.size());

    // 检查写入状态,确保无错误(可选)
    if (!myfile) {
        // 这里添加错误处理逻辑,如日志输出
    }

    delete[] buf;
    // 文件流析构时会自动关闭,无需手动调用close()
}

性能提升的核心原因

  • 批量写入代替逐字符操作:使用std::ofstream::write()直接写入整个vector的连续内存块,将系统调用次数从10亿次降到寥寥数次,完全发挥NVMe的连续写入性能,避免了逐字符输出的格式化开销和频繁缓冲区刷新。
  • 关闭IO同步与二进制模式:sync_with_stdio(false)关闭C++流与C标准IO的同步,消除额外锁和数据拷贝;std::ios::binary模式避免文本模式下的换行符检查与转换开销。
  • 大尺寸缓冲区:默认文件流缓冲区仅几KB,设置为64MB(或更大)可大幅减少用户态与内核态的切换次数,让磁盘控制器持续处于高效连续写入状态。

原代码的性能问题剖析

你原代码中的循环for (auto it = data.begin(); it != data.end(); ++it) { myfile << *it; }是性能灾难:

  • 每次<<操作都会触发格式化输出的内部逻辑,即使单字符也会经历复杂的状态检查与处理。
  • 小缓冲区会频繁触发实际磁盘写入,10亿次单字符写入让操作系统IO调度完全无法优化,严重浪费磁盘性能。

内容的提问来源于stack exchange,提问作者Josh Sanders

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 23:45:24