2017-01-16 7 views
0

私はループ内に「stuff」するCプログラムを持っています。ここでは、各繰り返しが何ヘルツになるのです。このループは、約80khzで動くことができました。ファイルI/OがCループの速度を遅くする

次に、ループにファイルI/Oを追加しました(Linuxのファイル記述子を読み書きする)ので、〜6kループ/秒を壊すことはできないようです。操作そのものは非常に安いので、待ち時間の原因となっているカーネルのコンテキストスイッチと思われます。したがって、2つの質問:

  • このような場合はどうすれば確認できますか?
  • カーネルにRTパッチを適用する以外に、できることは何ですか?
+0

問題を示す最も簡単なプログラムを教えてください。 (タイミングの仕方を含む) – slim

+1

アンタイムドループのタイミングに頼ることはできません。何らかの種類のタイミングハードウェアを組み込む必要があります。もちろん、I/Oはフローを遅くします。 「安い」ファイルIOはありません。 –

+1

1秒あたり80kの小さなファイルIOを試してみるのはおそらく最善の方法ではありません。あなたはバッファにすべてを印刷することはできませんし、バッファが十分に大きくなった場合にのみディスクにフラッシュしますか? また、RAMディスクを使用することもできます。 – 16tons

答えて

0

ディスクに書き込む代わりに、tmpfile()に書き込みます。パフォーマンスが向上するかどうかを確認します。まともな実装では、それは非常に大きくなるまでメモリに保持する必要があります。 これで問題が解決した場合は、書き込み遅延が発生し、処理が遅くなります。一度にtmpfile全体をフラッシュすると、改善が見られるかもしれません。バッファーを大きな値に設定すると同じ効果が得られます。

0

私は自分の疑問に答えるつもりですが、コードの変更はほとんどない非常に直接的な解決策があるからです。

私たちがプログラムの速度を落としているファイルディスクリプタの読み書きを大量に行う場合は、mmap()を使用してファイルディスクリプタを直接メモリにマップし、基本的にファイルをバイト配列として扱うことができます。あなたが書きたいものに合わせて十分なメモリを割り当ててください。

+0

*我々がプログラムの速度を落としているファイル記述子の読み書きのトンを行うなら、 mmap()を使ってファイルディスクリプタを直接メモリにマップし、基本的にファイルをバイト配列として扱います。実際のところ、 'mmap'は単純な' read() 'よりかなり遅くなる可能性があります。 ' - ファイルをバイト配列として扱うことを可能にするバーチャルマッピングを設定することは、*非常に高価な操作です。既に読み込まれているデータを参照し続けている場合のみです。 –

+0

[Linus Torvaldsさんからのこのコメント](http://marc.info/?l=linux-kernel&m=95496636207616&w=2)(あなたは彼のことを聞いたかもしれません...): "人々はmmap しかし、仮想メモリマッピングを使用してゲームをプレイすることは、非常に高価です それ自体がかなりの不利な点がいくつかありますアクセントを無視してください。 ...かなり目立つセットアップとティアダウンコスト...ページフォールディングは高価です。マッピングがどのように埋め込まれるかは、 **です。** " –

+0

ここでのポイントは、ループ内の読み取り/書き込みを最適化することです - ループ外の設定コストはOKです –

関連する問題