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 ほとんどかわらず。ちょっと意外。