標準愚痴出力

個人的なIT作業ログです。もしかしたら一般的に参考になることが書いているかもしれません(弱気

二つの io.Reader データ比較の高速化

以前、 zip/tarファイルと、それを展開したと思われるディレクトリがあった時、両者が一致していて一方を削除してしまっても大丈夫かを検証するツール(verifyarc)を書いた。

これをマイクラのバックアップデータの検証に使ってみたが、バックアップする時よりも、テストする時の方がなんか遅い。

データ(io.Reader)の比較で、まずは確実に動くことを優先し (*bufio.Buffer) ReadByte で1バイトずつ比較しているのがよくないかもしれない。ReadFullあたりで直接64KB単位で読んで bytes.Equal で一気に比較したら速くなるだろうか

48393312 ns/op と 3026203 ns/op なので、ReadFull and bytes.Equal の方が圧倒的に速い

さっそく、 verifyarc にも組み込んで、マイクラのバックアップデータの検証速度が改善されるか確認してみた。

@setlocal
@set "START=%DATE% %TIME%"
rclone cat "(中略)/minecraft-Demo_World-%DATE:/=%.tar.zst" | zstd -dc | verifyarc -C "%APPDATA%\.minecraft\saves" -
@echo START=%START%
@echo END=%DATE% %TIME%
方式 開始〜終了 秒数
bufio.ReadByte 10:49:31.89-11:00:30.68 658.79 (10分58秒79)
io.ReadFull & bytes.Equal 10:29:44.34-10:38:52.16 547.82 (9分7秒82)

処理プロセスの中に FTP + zstd + tar も入ってるので、純粋な比較時間ではないが、まぁまぁ速くなった。よしよし

余談

io.ReadFull のサイズを 256バイト程度にすると、逆に bufio.ReadByte より遅くなった。自分の環境だとバッファサイズ 4KB くらいを境に追い抜くようだ。