perldocのレンダリング結果をキャッシュして高速に表示するモジュールを作りました

perldocコマンドはPerlを書く人にとっては手放せないツールですが、 割と大きいPodファイル(DBI, perltoc, perlfunc, ...)を表示したり、Pod::Text::Color::Delightを使ってカラーリング表示しようとすると、表示するまで少し待たされるのが気になっていました。

そこで、 perldocで出力したフォーマット結果をキャッシュしておき、次回以降素早く表示するPod::Perldoc::CacheというCPANモジュールを作ってリリースしました。

https://metacpan.org/pod/Pod::Perldoc::Cache

インストール

$ cpanm Pod::Perldoc::Cache

使い方

perldocには-MオプションでPodファイルのフォーマッターを指定することができるので、そこに本モジュールを指定します。 一度目は通常通りの時間がかかりますが、二度目以降はキャッシュを読むようになります。

$ perldoc -MPod::Perldoc::Cache DBI # doesn't use cache
$ perldoc -MPod::Perldoc::Cache DBI # use cache!

また、Pod::Text::Color::Delightなどの他のフォーマッターを同時に使いたい場合は-w parserオプションを使います。

$ perldoc -MPod::Perldoc::Cache -w parser=Pod::Text::Color::Delight DBI

一々こんな長ったらしいコマンド書いていられないので、alias もしくは PERLDOC環境変数でオプションを設定するといいと思います。

$ alias perldoc='perldoc -MPod::Perldoc::Cache -w parser=Pod::Text::Color::Delight'
$ export PERLDOC='-MPod::Perldoc::Cache -w parser=Pod::Text::Color::Delight'

キャッシュ先

キャッシュの保存先はデフォルトで~/.pod_perldoc_cacheというディレクトリになっています。 そんな所に保存したくない!って方はPOD_PERLDOC_CACHE_DIR環境変数に保存先をセットしておけばそこを使ってくれます。

またキャッシュした際のPodの内容はハッシュ値を計算してあるので、元のPodが更新された場合に古いキャッシュは参照しないようになっています。

パフォーマンス

では実際にどれくらいPodの表示速度が速くなるか、実験してみました。 横軸がPodの行数、縦軸が表示までの秒数(小さいほうがベター)です。

f:id:furuyamayuuki:20140427222007p:plain

赤が標準のperldocコマンドで実行した結果、青が本モジュールを使用した結果ですが、 赤がPodの行数に比例して遅くなってる一方、青は行数に関係なく常に高速に表示できていることがわかります。

終わりに

perldocのレンダリング結果をキャッシュするなんて相当ニッチな機能ですが、 体感的にも表示が少し速くなるので、とりあえず設定しておくといいと思います!

機能追加やバグ報告はgithubまでお願いします!

https://github.com/addsict/Pod-Perldoc-Cache