Rust で Zip を展開する
結論
速度がほしいか?ならば ripunzip を使え
サンプルコード
Rust で Zip を展開したい
Windows でポータブルな Python のビルドである Win Python の Zip をダウンロードしてWindows Explorer で展開したらくっそ遅かったです。
なんとその時間 2分 20 秒。びっくらするほど遅い。
というわけで、これを使って Rust で zip 展開して速度を確認してみます。
比較ライブラリ
今回使ったのは以下の3つです。
-
zip : 2.3
- zip-extract: 0.2.0
-
ripunzip: 2.0.1
- 中身は上記の zip (2.3).
- 並列処理が可能
- async_zip: 0.0.17
2025/4現在 zip の最新版は 2.6.1 ですが、 ripunzip が 2.3 でないとコンパイルできないので、 2.3 で展開しています。 2.6.1 にしても速度差は見られませんでしたので問題ないかと。
ソースコード
結果
展開にかかった時間を計測し、グラフにした結果がこちらです。
実行するたびに多少はブレるのでおおよそです。(平均取るのは面倒だった)
Windows上
- ripunzip: 2.1 s
- async-zip(並列): 1.5s
- zip: 3.0 s
- async-zip: 3.5 s
WSL2上
- ripunzip: 0.22 s
- async-zip(並列): 0.51s
- zip: 0.56 s
- async-zip: 1.8 s
え、なにこれ。 WSL かどうかでこんなに変わるん?
ていうか、 Windows おっっそ。
ripunzip は安定して早いですね。単純に zip-extract で展開するより倍ぐらい早いです。が、並列処理してても倍かぁという感じもします。
期待の async-zip は zip の3倍ぐらい遅いという結果に WSL上で はなりました。悔しかったので tokio::task::spawn
でコア数分(16)並列化してみましたが、それでようやく zip に並ぶ程度……と WSL で開発してたときは思ってたのですが、ついでに Windows 上でもやってみたらなんと一番早かった。 Windows どうなってんの。
とりあえず、特に理由がなければ安定して早い ripunzip を使うのがいいですね。
ただ、 zip-extract で展開すると、最上位階層を省いてくれるという機能があり、便利です。 ripunzip は URL からダウンロードしつつ展開するという謎便利機能があるのですが、この最上位階層を省く機能はなく。そこは残念ポイントです。
まとめ
ripunzip を使うのがいいでしょう。ただ、最上位階層を外したい場合は zip-extract を使うほうが便利かもしれません。
Windows を対象とするなら async-zip を並列化することも可能性としてはありです。ていうか、 Windows がなんでこんな遅いのか誰か教えてください。ファイルシステム?仮想ディスクの差?それとも Windows Defender ?マジわからん。
以上です。
Discussion