首頁 >後端開發 >C++ >如何最大限度地提高 C 語言的二進位檔案寫入速度?

如何最大限度地提高 C 語言的二進位檔案寫入速度?

Patricia Arquette
Patricia Arquette原創
2024-12-15 00:31:12906瀏覽

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::syncwith_stdio_stdio (false) 的串流同步
  • 使用std::vector 和std::iota、std::shuffle 產生向量化數據,和 std::random_device
  • 時間測量使用std::chrono

基準測試和結果:

對不同緩衝區大小(1MB-4 GB)的不同平台(筆記型電腦和桌上型電腦)上的程式碼進行基準測試:

  • 在兩個平台上,當使用小型檔案時,fstream的性能均優於 FILE*緩衝區(1MB),但在更大緩衝區方面落後。
  • fstream 能夠充分利用大緩衝區的 SSD 頻寬,消除 FILE* 的效能優勢。

結論:

總而言之,要有效地將大緩衝區寫入C 中的二進位文件,考慮:

  • 對小緩衝區使用std::fstream
  • 對大緩衝區使用FILE* 和fwrite
  • 停用 std::ios 串流同步
  • 最佳化資料產生與基準測試

以上是如何最大限度地提高 C 語言的二進位檔案寫入速度?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn