Rust で Zip を展開する

に公開

結論

速度がほしいか?ならば ripunzip を使え

サンプルコード

https://github.com/nodamushi/zenn-program/tree/main/src/rust/unzip

Rust で Zip を展開したい

Windows でポータブルな Python のビルドである Win Python の Zip をダウンロードしてWindows Explorer で展開したらくっそ遅かったです。

なんとその時間 2分 20 秒。びっくらするほど遅い。

というわけで、これを使って Rust で zip 展開して速度を確認してみます。

比較ライブラリ

今回使ったのは以下の3つです。

2025/4現在 zip の最新版は 2.6.1 ですが、 ripunzip が 2.3 でないとコンパイルできないので、 2.3 で展開しています。 2.6.1 にしても速度差は見られませんでしたので問題ないかと。

ソースコード

https://github.com/nodamushi/zenn-program/blob/main/src/rust/unzip/src/main.rs

結果

展開にかかった時間を計測し、グラフにした結果がこちらです。

実行するたびに多少はブレるのでおおよそです。(平均取るのは面倒だった)

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