首页 >后端开发 >C++ >如何最大限度地提高 C 语言的二进制文件写入速度?

如何最大限度地提高 C 语言的二进制文件写入速度?

Patricia Arquette
Patricia Arquette原创
2024-12-15 00:31:12903浏览

How Can I Maximize Binary File Write Speed in C  ?

提高 C 语言二进制文件写入的数据传输速度

简介:

高效地将大缓冲区写入二进制文件是对于性能敏感的应用程序来说通常至关重要。在本文中,我们将探讨如何在 C 中优化此过程的问题。

初始方法和瓶颈:

与文件相比,提供的代码似乎表现不佳复制操作。潜在的瓶颈包括:

  • 使用 fstream 而不是 FILE*(标准 I/O)进行二进制写入
  • 低效的写入循环,频繁的系统调用

优化解决方案:

更快的方法是使用FILE* 和 fwrite:

#include <stdio.h>

const unsigned long long size = 8ULL*1024ULL*1024ULL;
unsigned long long a[size];

int main()
{
    FILE* pFile;
    pFile = fopen("file.binary", "wb");
    for (unsigned long long j = 0; j < 1024; ++j)
    {
        // Data generation
        fwrite(a, 1, size*sizeof(unsigned long long), pFile);
    }
    fclose(pFile);
    return 0;
}

此代码实现了大约 220MB/s 的写入速度,接近 SSD 的极限。

进一步优化:

为了进一步提高代码效率,我们可以实现以下:

  • 禁用与 std::ios_base::sync_with_stdio(false) 的流同步
  • 使用 std::vector 和 std::iota、std::shuffle 生成矢量化数据,和 std::random_device
  • 时间测量使用std::chrono

基准测试和结果:

对具有不同缓冲区大小(1MB-4GB)的不同平台(笔记本电脑和台式机)上的代码进行基准测试:

  • 在两个平台上,当使用小文件时,fstream 的性能都优于 FILE*缓冲区(1MB),但在更大缓冲区方面落后。
  • fstream 能够充分利用大缓冲区的 SSD 带宽,消除 FILE* 的性能优势。

结论:

总而言之,要有效地将大缓冲区写入 C 中的二进制文件,考虑:

  • 对小缓冲区使用 std::fstream
  • 对大缓冲区使用 FILE* 和 fwrite
  • 禁用 std::ios 流同步
  • 优化数据生成和基准测试

以上是如何最大限度地提高 C 语言的二进制文件写入速度?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn