Data::Dumper と Storable

変数の中身を Perl コードの形に表現してくれる Data::Dumper というのがあります。吐いた内容は,たいてい eval すれば取得できるので(サブルーチンのリファレンスについては戻りません),シリアライザとして使ったりもします。
いっぽう,Storable というモジュールもあるのですが,こちらは独自形式で吐きます。freeze と thaw というメソッドで,書き出し・読み出しを行うことができます。
これらのシリアライザのベンチマークをとってみました。わりと単純な小さめのハッシュを Data::Dumper & eval,Storable::freeze & Storable::thaw しました。

Benchmark: timing 50000 iterations of ...
dumper_dump:      17 wallclock secs (...) @ 2977.96/s (n=50000)
dumper_eval:       9 wallclock secs (...) @ 5624.30/s (n=50000)
storable_freeze:   7 wallclock secs (...) @ 7256.89/s (n=50000)
storable_nfreeze:  7 wallclock secs (...) @ 7267.44/s (n=50000)
storable_thaw:     2 wallclock secs (...) @ 24752.48/s (n=50000)

Storable は XS ですし,人の見た目にやさしく整形する必要もないので,やっぱり早いです。

追記

タイミングよく?dan 氏のところで「store, freeze のかわりに nstore, nfreeze を使え」と書いてあったので,nfreeze もまぜてみました。これは,ネットワークオーダーで数値を表現する…つまりエンディアンも考慮して freeze するというものです。将来的にマシンが変わるかもしれないくらい永続化したいとか,ネットワーク越しに他のマシンとやりとりしたい,という場合に有用ですね。結果は,freeze と nfreeze ほとんどかわらず。ちょっと意外。