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回め以降は上記の結果になる. なぜだかわからない.

以上