0

各行が単一のデータであるデータを含むファイル (10-20MB) があります。

ファイルシステムからファイルを読み取るCプログラムがあり、コマンドライン入力に基づいて、ファイルの各行を読み取り、各行で計算を行って、その行を返す必要があるかどうかを判断し、サブセットを返しますデータ。

プログラムが fread を実行し、最初にファイル全体をメモリに読み込み、メモリから直接解析するとします。

ファイルシステムから読み取る代わりに、次のような配列を作成してデータをプログラムに直接コンパイルした場合、プログラムの実行速度は速くなりますか?

char *dataArray[] = {"data1", "data2", "data3"....};

OS はファイル システムからバイナリ全体を読み取る必要があるため、私の直感では、ファイル システムからの読み取りが上位ビットになるため、両方の手法の実行時間は似ています。しかし、これについてもっと決定的なアイデアを持っている人はいますか?

4

2 に答える 2

3

すべてをプログラムリテラルとして定義すると、確かに高速になります。

データファイルの比較的遅い「オープン」呼び出しは必要ありません。また、データをバッファからストレージに移動する必要もありません。

これは、一般的な最適化でした。1970年以降、すべてのプログラミング/コーディングスタイルブックでは、これを行わないことを強く推奨しています。実際のパフォーマンスの向上は最小限であり、パフォーマンスで得たものは保守性と柔軟性で失われます。

このタイプの問題に対して迅速で保守可能な最適化が必要な場合は、「mmap」呼び出しを調べてください。これにより、バッファーがプログラムで直接使用可能になり、データの移動が最小限に抑えられます。

于 2012-04-10T04:07:55.920 に答える
1

実行時間に大きな違いがあるとは思えませんが、メモリ使用率の観点からは、データを実行可能ファイルに入れる (そしてconst適切に修飾する) ことで大きな違いが生じるでしょう。

ファイルから 10 ~ 20 MB のデータをプログラムmallocで割り当てられたメモリに読み込む場合、データは最初はメモリ内の 2 つの場所に存在します。ファイルシステム キャッシュとプログラムのプライベート メモリです。前者のコピーは、メモリが不足している場合は破棄できますが、後者は解放されるまで物理メモリまたはスワップを永久に占有します。

一方、10 ~ 20 MB のデータがプログラムのイメージ (実行可能ファイル内) の一部である場合、データはデマンド ページングされ、必要に応じていつでも破棄できます。それらが再び必要になります。

于 2012-04-10T04:05:51.643 に答える