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 の優れた機能を破棄することになりますが、読み取りスループットが本当に重要な場合は、間接レイヤーをスキップします。