大容量ファイルI/Oの効率について 其の弐

id:NyaRuRu さんからコメントでご指摘を頂き、再計測したのですが下のような結果が得られました。


FILE_FLAG_NO_BUFFERING 指定のない ReadFile()
#FF0000;">-赤線-:リニアにアクセス速度が低下していく。FILE_FLAG_NO_BUFFERING の指定がある場合にはリニアな速度低下の傾向は見られないことから、大容量ファイルの I/O というかリードを行うことに対して Windows の I/O バッファリングアルゴリズムにパフォーマンスバグがあると思われる。FILE_FLAG_NO_BUFFERING を指定すれば回避できるとはいえ、コンシューマ市場向けにもTBクラスのストレージが出回ってる昨今、これは致命的な問題だと思う。
FILE_FLAG_NO_BUFFERING 指定のある ReadFile()
#008800;">-緑線-:2GiB の読み込みに概ね12-13秒台の高速でコンスタントなアクセス速度を誇る。(・∀・)イイ!! FILE_FLAG_NO_BUFFERING を出力ファイルに対して使用するとエラーになることから、入力ファイルに対しても開発・テスト環境ではエラーが起きなくてもその他の環境やシチュエーションによってはエラーになったりしたら嫌だなと避けてたんですが、これなら例えエラーになるケースがあろうとも使わざるを得ないですね。念のためにネットワーク越し、CD-R、FAT の USB メモリからの読み込みを試してみましたがエラーにはならないですね。id:NyaRuRu さん、ありがとう!
FILE_FLAG_NO_BUFFERING 指定のある ファイルマッピング
#0000FF;">-青線-:2GiB の読み込みに概ね14秒台の区間と概ね20秒台の区間が存在しそのアクセス速度は時系列に矩形波を描く。矩形波ってなんでやねん? マジで意味がわからん。

あと、既にファイルI/Oをそれ専用のスレッドで行うようにしている関係もあり、非同期がいいって話でしたが今回は試してないし、ETWによる測定も結局やってないです。