13

私は、パフォーマンスが非常に重要であるが重要ではないプログラムを書いています。現在、私は行ごとにテキストを読み込んでおり、各行を取得するためFILE*に使用しています。fgetsいくつかのパフォーマンス ツールを使用した後、アプリケーションが実行されている時間の 20% から 30% が内部にあることがわかりましたfgets

テキスト行を取得するより高速な方法はありますか? 私のアプリケーションはシングルスレッドで、複数のスレッドを使用するつもりはありません。入力は標準入力またはファイルからの可能性があります。前もって感謝します。

4

7 に答える 7

8

どのプラットフォームを使用しているかはわかりませんが、UNIX に似ている場合は、read() システム コールを試してみるとよいでしょう。このシステム コールは、fgets() などの追加のバッファリング レイヤーを実行しません。これにより、少し速度が上がるかもしれませんが、逆に遅くなるかもしれません。

于 2009-04-09T14:31:09.527 に答える
4
  1. fgets_unlocked() を使用しますが、最初に何をするかをよく読んでください

  2. fgets() の代わりに fgetc() または fgetc_unlocked() を使用してデータを取得します。fgets() を使用すると、データは 2 回メモリにコピーされます。最初は C ランタイム ライブラリによってファイルから内部バッファにコピーされ (ストリーム I/O はバッファリングされます)、次にその内部バッファからプログラム内の配列にコピーされます。

于 2009-04-09T14:26:48.040 に答える
4

ファイル全体を一度にバッファに読み込みます。

そのバッファからの行を処理します。

それが最速の解決策です。

于 2009-04-09T14:30:48.747 に答える
3

大量のデータをRAMに読み込んで作業することにより、ディスクからの読み取りに費やす時間を最小限に抑えることができます。ディスクからの読み取りは遅いので、ファイル全体を(理想的には)一度読み取ってから作業することにより、読み取りに費やす時間を最小限に抑えます。

CPUキャッシュがCPUが実際にRAMに戻る時間を最小化する方法のように、RAMを使用して、実際にディスクに移動する回数を最小化することができます。

于 2009-04-09T01:43:26.923 に答える
2

データがディスクからのものである場合、IO バウンドになる可能性があります。

その場合は、より高速なディスクを入手してください (ただし、まず、既存のディスクを最大限に活用していることを確認してください...一部の Linux ディストリビューションでは、最初からディスク アクセスが最適化されていません ( hdparm))、データを次の場所にステージングします。事前にメモリ (RAM ディスクにコピーするなど) を使用するか、待機する準備をしてください。


IO バウンドでない場合は、コピーに多くの時間を浪費している可能性があります。いわゆるゼロコピー方式の恩恵を受けることができます。メモリのようなものはファイルをマップし、ポインターを介してのみアクセスします。

それは私の専門知識を少し超えているので、読むか、より知識のある助けを待つ必要があります.

ところで -- あなたは問題の価値よりも多くの仕事に取り掛かっているかもしれません。たぶん、より高速なマシンがすべての問題を解決するでしょう...

注意--標準入力をメモリマップできるかどうかは明らかではありません...

于 2009-04-09T01:28:20.767 に答える
2

環境によっては、setvbuf() を使用してファイル ストリームが使用する内部バッファのサイズを大きくすると、パフォーマンスが向上する場合と向上しない場合があります。

これは構文です -

setvbuf (InputFile, NULL, _IOFBF, BUFFER_SIZE);

ここで、InputFile は fopen() を使用して開いたばかりのファイルへの FILE* であり、BUFFER_SIZE はバッファーのサイズです (この呼び出しによって割り当てられます)。

さまざまなバッファー サイズを試して、プラスの影響があるかどうかを確認できます。これは完全にオプションであり、ランタイムはこの呼び出しでまったく何もしないことに注意してください。

于 2009-04-09T07:13:04.820 に答える
0

OS がサポートしている場合は、非同期ファイル読み取りを試すことができます。つまり、CPU が他の処理を行っている間にファイルがメモリに読み込まれます。したがって、コードは次のようになります。

start asynchronous read
loop:
  wait for asynchronous read to complete
  if end of file goto exit
  start asynchronous read
  do stuff with data read from file
  goto loop
exit:

複数の CPU がある場合、1 つの CPU がファイルを読み取り、データを行に解析し、もう 1 つの CPU が各行を取得して処理します。

于 2009-04-29T14:41:58.170 に答える