フラミナル

考え方や調べたことを書き殴ります。IT技術系記事多め

なぜ標準出力は標準エラーより速いのか? の記事をよんで

この記事をみてその発想はなかったので学んでみる。

DeepL で翻訳するので意訳に注意。

blog.orhun.dev

なぜその疑問に気づいたのか?

もともと界隈でよくいわれていた。

実際紹介されているこの gif でみても、stdout/stderr では fps に差がある。

https://blog.orhun.dev/stdout-vs-stderr/stdout-vs-stderr.gif

どのようなアプローチで調査したのか

mstange/samply: Command-line sampling profiler for macOS and Linux という rust のプロファイリングツールを使って測定。これによりシステムコールをトレースし、stdout のコール数が少ないことを確認した。

つまり stdout の方が書き込みコール数が少ないので、同じ時間で多くのフレームをレンダリングできるということ。ここでバッファリングされていると仮定を立てている。

続いて、実際に書き込みしているコードをみるが抽象化されていて stdout/stderr でも同様に扱えるようになっていることがわかったので、rust の標準ライブラリを参照しに行った。するとLineWriter と呼ばれる writer をラップして出力をバッファリングする構造体をみつけ、 stdout がこれにラップされてることがわかった。つまり、都度書き込みではなく改行コードが検出するたびにフラッシュされることがわかった。

なぜ遅いのか?

上記の調査の結果、stdout のみが LineBuffer されている(一行ごとにバッファリングされて書き込まれる)ので早いとわかった。

この後、この結論を裏付けるために stdout をバッファせずにコードを書いてみることで試したところ、stdout(バッファなし)とstderrでの性能が同じになった。