instanceof演算子(2)
Perlのinstanceof演算子のベストプラクティスは何か
Cygwinで試すとref_evalよりscalar_utilが遅かったんですが一般的にはそうでもないようです。
Linux/Perl 5.8.5で試してみると確かにref_evalよりscalar_utilのほうが早い傾向にあります。
For Foo=HASH(0x8a1ccec) <- Fooのインスタンス
Rate ref&eval{} scalar_util instance() instanceof
ref&eval{} 45948/s -- -17% -58% -66%
scalar_util 55137/s 20% -- -50% -59%
instance() 109226/s 138% 98% -- -19%
instanceof 135244/s 194% 145% 24% --
For Foo::X::X::X=HASH(0x8b43064) <- Fooのサブクラスのインスタンス
Rate ref&eval{} scalar_util instance() instanceof
ref&eval{} 39384/s -- -15% -35% -43%
scalar_util 46394/s 18% -- -24% -33%
instance() 60703/s 54% 31% -- -12%
instanceof 68923/s 75% 49% 14% --
For Unrelated=ARRAY(0x8b43040) <- Fooと無関係なオブジェクト
Rate ref&eval{} scalar_util instance() instanceof
ref&eval{} 43952/s -- -17% -40% -48%
scalar_util 53227/s 21% -- -27% -37%
instance() 73080/s 66% 37% -- -13%
instanceof 84329/s 92% 58% 15% --
For undef
Rate scalar_util instance() instanceof ref&eval{}
scalar_util 123242/s -- -41% -61% -67%
instance() 208776/s 69% -- -34% -44%
instanceof 317021/s 157% 52% -- -15%
ref&eval{} 374797/s 204% 80% 18% --
For {}
Rate ref&eval{} scalar_util instance() instanceof
ref&eval{} 17612/s -- -86% -92% -95%
scalar_util 122879/s 598% -- -41% -62%
instance() 208776/s 1085% 70% -- -35%
instanceof 322947/s 1734% 163% 55% --それで,このinstance()がXSによる実装,instanceofが"<<"演算子のPLハックによる一般オーバーロード版。instanceof演算子はscalar_utilよりほぼ常に50%ほど高速で,instance()より10-20%ほど高速という結果になりました。
Scalar::Util::Refという名前でモジュールを作ってますが,たかが50%の高速化のためにわざわざ変わったセマンティクスを導入していいものかどうか考え中なのでまだCPANにはあげてません。