以前、 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 くらいを境に追い抜くようだ。