C でファイル書き込みパフォーマンスを向上させる方法
バイナリ ファイルに大量のデータを書き込む場合、パフォーマンスの最適化が非常に重要です。書き込み速度を向上させる方法は次のとおりです:
直接ファイル処理に FILE* を利用する:
サンプル コードでは、FILE* を使用することでファイルへの直接アクセスが可能になり、バイパスが可能になります。中間層とオーバーヘッドの削減。元の質問で確認されたように、このアプローチによりパフォーマンスが大幅に向上します。
FILE* 使用のためのコードの最適化:
#include <stdio.h> ;<br>const unsigned Long Long サイズ = 8ULL<em>1024ULL</em>1024ULL;<br>unsigned long long a[size];</p> <p>int main()<br>{</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">FILE* pFile; pFile = fopen("file.binary", "wb"); for (unsigned long long j = 0; j < 1024; ++j){ // Some calculations to fill a[] fwrite(a, 1, size*sizeof(unsigned long long), pFile); } fclose(pFile); return 0;
}
< /pre>
この最適化されたコードは、 FILE* を使用してバイナリ ファイルに直接書き込むと、書き込み速度が向上します。
アプローチの比較:
最近の測定では、std::fstream が FILE と同等のパフォーマンスを提供することが示されています。 * 大きなファイルの書き込み用。以下に、さまざまなアプローチの比較を示します。
#include <fstream></p> <h1>include <chrono></h1> <h1>include <vector></h1> <h1>含める<cstdint></h1> <h1>include <numeric></h1> <h1>include <random></h1> <h1>include <algorithm></h1> <h1>include <iostream></h1> <h1>include <cassert></h1> <p>long long option_1(std::size_t バイト)<br>{</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">// Using std::fstream std::vector<uint64_t> data = GenerateData(bytes); auto startTime = std::chrono::high_resolution_clock::now(); auto myfile = std::fstream("file.binary", std::ios::out | std::ios::binary); myfile.write((char*)&data[0], bytes); myfile.close(); auto endTime = std::chrono::high_resolution_clock::now(); return std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime).count();
}
long long オプション_2(std::size_t bytes)
{
// Using FILE* std::vector<uint64_t> data = GenerateData(bytes); auto startTime = std::chrono::high_resolution_clock::now(); FILE* file = fopen("file.binary", "wb"); fwrite(&data[0], 1, bytes, file); fclose(file); auto endTime = std::chrono::high_resolution_clock::now(); return std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime).count();
}
測定結果は、option_1 (std::fstream) と option_2 (FILE*) の両方が同等のパフォーマンスを達成していることを示しています大きなファイルの場合
結論:
C でバイナリ ファイルに大きなバッファを書き込む場合、 FILE* と std::fstream の両方が高いパフォーマンスを提供します。この 2 つのどちらを選択するかは、特定の要件と好みによって異なります。
以上がC で最適なファイル書き込みパフォーマンスを実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。