この記事をみてその発想はなかったので学んでみる。
DeepL で翻訳するので意訳に注意。
なぜその疑問に気づいたのか?
もともと界隈でよくいわれていた。
実際紹介されているこの gif でみても、stdout/stderr では fps に差がある。
どのようなアプローチで調査したのか
mstange/samply: Command-line sampling profiler for macOS and Linux という rust のプロファイリングツールを使って測定。これによりシステムコールをトレースし、stdout のコール数が少ないことを確認した。
つまり stdout の方が書き込みコール数が少ないので、同じ時間で多くのフレームをレンダリングできるということ。ここでバッファリングされていると仮定を立てている。
続いて、実際に書き込みしているコードをみるが抽象化されていて stdout/stderr でも同様に扱えるようになっていることがわかったので、rust の標準ライブラリを参照しに行った。するとLineWriter
と呼ばれる writer をラップして出力をバッファリングする構造体をみつけ、 stdout がこれにラップされてることがわかった。つまり、都度書き込みではなく改行コードが検出するたびにフラッシュされることがわかった。
なぜ遅いのか?
上記の調査の結果、stdout のみが LineBuffer
されている(一行ごとにバッファリングされて書き込まれる)ので早いとわかった。
この後、この結論を裏付けるために stdout をバッファせずにコードを書いてみることで試したところ、stdout(バッファなし)とstderrでの性能が同じになった。