GNU/Linux >> Linux の 問題 >  >> Linux

Linux の cat に比べて、システム コールを使用した cat 関数が遅いのはなぜですか?

ああ、あなたの編集に基づいて、先読みバッファに噛まれていました。ファイルを並行して読み取る 2 つのプログラムは、一度実行しただけではテストできません。ファイルがディスク上にあるため、最初のファイルは常に遅くなります。ファイルがメモリ内にあると、2 番目のファイルはより速く実行されます。それぞれに新しいデータを作成するか、1 つを実行してから両方を実行し、両方が先読みバッファの利点を得る必要があります。


最適化せずに (または最適化設定をそれほど高くせずに) コンパイルしたのではないでしょうか?

また、コードは sysWriteBuffer を呼び出します readBytes で 1 回 ゼロに等しい -- それが (部分的に) それを説明しているのではないでしょうか?

sysWriteBuffer をインライン化することもできます (コンパイラ スイッチを介して、または手動で)。

「インライン化」とは、関数呼び出しのオーバーヘッドを取り除くために、関数の本体をその呼び出しサイトにコピーすることを意味します。コンパイラがこれを自動的に行う場合があります (-O3 により、gcc でこの最適化が有効になると思います)。 inline を使用することもできます 関数をインライン化するようにコンパイラに指示する gcc のキーワード。これを行うと、宣言は次のようになります:

static inline int sysWriteBuffer(int fdout, char *buffer, ssize_t readBytes) {
....

mmap(2) を調べてください。

ftell/fread の優れた機能を破棄することになりますが、読み取りスループットが本当に重要な場合は、間接レイヤーをスキップします。


Linux
  1. procps-ngを使用してターミナルでLinuxシステムを監視します

  2. straceを使用したLinuxでのシステムコールの理解

  3. 楽しいLinuxウイルスプログラムを使用して説明された13の基本的なLinuxシステムコール

  1. xtermを使い続ける理由

  2. noatimeでLinuxシステムのパフォーマンスを向上させる

  3. AntergosLinuxに恋をした理由

  1. Linuxシャットダウンコマンド(例付き)

  2. LinuxでのCronを使用したシステムタスクのスケジューリング

  3. Linuxのセキュリティとユーザビリティのバランス