tarでまとめるのとそのままではどっちが効率がいい?
タイトルそのままの実験です.
きっかけはBMSの読み込みが長いこと, しかし, CS版の弐寺ではかなり高速. この違いは何なのか考えた時, BMSはファイルがバラバラだからではないかと考察したのでそれを検証する次第です.
大体全体で60MBぐらいあるBMS曲(厭世アリス - LeaF)をディレクトリにそのまま展開したものとtarアーカイブしたもので用意しpython3で処理してみた.
コード
標準ライブラリで読み出し, ファイルとしてダンプする.
ディレクトリ版 (naive.py)
import os import time out = open("naive.dump", "wb") start = time.time() base = "[clover]LeaF_AliceinMisanthrope" for e in os.listdir(base): buf = open(base + "/" + e, 'rb') out.write(buf.read()) buf.close() span = time.time() - start print(span)
tar版 (tar.py)
import tarfile import time out = open("tar.dump", "wb") start = time.time() handle = tarfile.TarFile.open("ensei_tar.tar") for e in handle.getmembers(): if (e.isfile()): buf = handle.extractfile(e) out.write(buf.read()) buf.close() span = time.time() - start print(span)
結果
単位はいずれも秒
% python3 naive.py 0.22434473037719727
% python3 tar.py 0.4075179100036621
tarのほうが遅い
しかしこれぐらいの差だとあんまり実感がわかないぐらいの差しかない. 読み込み速度の違いには, どうやらこれ以外の要因も関わっているようだ. (デコードとか)
主観だが, ファイル読み込みはオーバーヘッドがそれなりにあると考えていて, 個別ファイルと1ファイルにまとまっているのでは後者のほうが速度的に有利だと考えていた. しかしこれはその予想を裏切ることになっている.
不思議なこと
かなり計測にばらつきが出る. コードを書いて一番初めに実行した時にはかなり時間がかかる(10秒ぐらい). 2回め以降は上記の結果になる. なぜだかわからない.
以上