ああ、あなたの編集に基づいて、先読みバッファに噛まれていました。ファイルを並行して読み取る 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 の優れた機能を破棄することになりますが、読み取りスループットが本当に重要な場合は、間接レイヤーをスキップします。