IT Office Nishimiyahara

個人用スマホから商用プログラミングまでなんでもお任せ下さい

軽い系(?)のAccessorを比較してみた

      2014/05/20

Accessorの比較は、App::Benchmark::Accessorsが有名ですよね。 しかし、NanoAで使われている、Class::Accessor::Lite等、比較されていないモジュールもあります。 Accessorとして使う分には十分な機能を持っているLiteを比較してみたかったので、いくつかのモジュールを選んでベンチマークを取ってみました。

選んだのは、Liteを含めて5つのモジュール。

  • Class::Accessor::Fast
  • Class::Accessor::Faster
  • Class::Accessor::Lite
  • Object::Tiny::RW
  • Object::Simple

アクセサをあらかじめ定義しておき、ベンチマークの中でnewしてsetしてgetしてsetする、という事をやりました。 まずは結果を。

上位3モジュールは僅差ですが、Class::Accessor::Liteが最も速かったです。 Liteは、use baseを使った継承ではなく、モジュールを使うようにして定義します。 Class::AccessorやFastに慣れた人は戸惑うかもしれません。 また、継承を使わないため、newメソッドなどは別で実装する必要があります。 スピードは次点ですが、Object::Tiny::RWはアクセサの定義が簡単でした。 useする時に、アクセサをインポートするように宣言すればよいだけで、アクセサの作成を意識しません。 ソースは読んでいないので仕組みはわかりませんが、newメソッドも使えるので便利です。 ただ、名前が惜しいです。 Object::TinyがReadOnlyのアクセサを作成するモジュールなのでしょうがないのでしょうが、付け足した感が満載です。 Object::Simpleは、他の4つのモジュールと違う動作をする箇所があります。 他のモジュールはsetの時に、その値を返しますが、Object::Simpleはオブジェクトそのものを返します。 慣れもあるのでしょうが、この挙動は不思議に感じました。 また、メソッド作成で複数のアクセサが指定出来ないのも不便に感じます。 まあ、このモジュールは、アクセサじゃなくアトリビュートという扱いっぽいので、狙うところが違うのかもしれません。 独断と偏見でまとめると、NanoAで使うならClass::Accessor::Lite、それ以外で使うならObject::Tiny::RWが良いと思いました。 ベンチマークのソースは以下のとおりです。

この記事を書きながら、何度か実行しましたが、上位3モジュールの順位は入れ替わることもありました。

respo

respo link

ZenBackWidget

 - 情報技術について