パフォーマンスを向上させたい場合は、固定長フィールドを使用する必要があります。可変長フィールドを解析またはロードしても、パフォーマンスが大幅に向上するわけではありません。テキスト行ごとの読み取りには、行末トークンのスキャンが含まれます。スキャンは時間を無駄にします。
次の提案を使用する前に、コードをプロファイリングして、パフォーマンスのベースライン時間または数値を確立します。各最適化のパフォーマンス デルタを計算できるようになるため、各提案の後にこれを行います。私の予測では、各最適化でデルタが小さくなるということです。
最初にファイルを固定長レコードに変換し、引き続きテキストを使用することをお勧めします。必要に応じてフィールドをスペースで埋めます。したがって、レコードのサイズがわかれば、メモリへの読み取りをブロックして、メモリを配列として扱うことができます。これにより、大幅な改善が得られるはずです。
この時点で、ボトルネックは依然としてファイル I/O 速度であり、(ファイル I/O は OS によって制御されているため) 実際には大幅な改善はできません。また、テキストのスキャン/変換です。テキストを数値に変換し、最後にバイナリに変換します。 何としても、データ ファイルを人間が読める形式に保つことをお勧めします。
データ ファイルを読みにくくする前に、アプリケーションをスレッドに分割してみてください。1 つのスレッドが GUI を処理し、別のスレッドが入力を処理し、別のスレッドが処理を処理します。アイデアは、プロセッサが待機するのではなく、コードの一部を常に実行することです。最新のプラットフォームでは、CPU がコードを処理している間にファイル I/O を実行できます。
移植性を気にしない場合は、プラットフォームに DMA 機能があるかどうかを確認してください (DMA またはダイレクト メモリ アクセス コンポーネントを使用すると、プロセッサを使用せずに、またはプロセッサの使用を最小限に抑えてデータを転送できます)。注意すべき点は、多くのプラットフォームがプロセッサと DMA の間でアドレスとデータ バスを共有していることです。したがって、一方のコンポーネントがブロックまたは一時停止され、もう一方のコンポーネントがアドレス バスとデータ バスを使用します。したがって、役立つ場合とそうでない場合があります。プラットフォームの配線方法によって異なります。
key フィールドを変換して、数値、別名tokensを使用します。トークンは数値であるため、ジャンプ テーブル (switch ステートメントも) へのインデックスとして、または単に配列へのインデックスとして使用できます。
最後の手段として、ファイルをバイナリに変換します。バイナリ バージョンには、トークンとしてのキーと値の 2 つのフィールドが必要です。データを大きなチャンクでメモリに取り込みます。
概要
- 大きなデータ ブロックをメモリに移動します。
- ベースラインのパフォーマンス測定値を確立するために変更を行う前にプロファイリングします。
- 最適化ごとにプロファイリングを行い、一度に 1 ステップずつ最適化します。
- 人間が読める形式でデータ ファイルを保持することを好みます。
- データ ファイルへの変更を最小限に抑えます。
- 固定長フィールドを使用するようにファイルを変換します。
- アプリケーションが待機しないように、スレッドまたはマルチタスクを使用してみてください。
- テキストを数値トークンに変換します (人間の可読性を低下させます)
- 最後の手段としてデータをバイナリに変換します (人間が読み取りとデバッグを行うのは非常に困難です)。