2011年12月14日水曜日

Underscore.phpとarryと_wwの速度比較してみた

PHP Advent jp 2011で書いた_ww(Underscore-Walla-Walla)ですが、せっかくなので他の実装と速度比較してみました。

比較対象は、実装の元ネタの__と、同じくPHP Adventで発表されたarryです。

また比較用のコードとデータはarryで使われていた「悲しき今シーズンの結果」を利用させてもらいました。ありがとうございました。


まずはリファクタリングから

が、利用するにはsortがないし、クラスは二つに分かれてるし。
最初は_wwのリファクタリングから始めました。

まずはgitでブランチを切って、開発開始です。
次にテストクラスを作成してから、さくっとクラスをマージ。
簡単に出来ました。テストがあると、変更するのに気が楽ですね。

速度比較について予測してみる

測定する前に予測を立てます。

まずは、自分の_wwが一番遅いと予想。
理由はマジックメソードを使っているので。

一番早いのはShinさんのarryクラス。
最初からチェーンするようにメソードが組み立てられているので、一番早いはず。

すると中間は、Underscore.php。
これもマジックメソード使ってないけれど、各メソード内での処理があるので、チェーンすると少し処理が増えると予想。

速度比較の結果

ソースコードはgistで公開してあります。
インストールですが、どこかのフォルダーでgit bashを開始して、
git clone git://gist.github.com/1460352.git gist-1460352
git clone git://github.com/shin1x1/arry.git
git clone git://github.com/brianhaveri/Underscore.php.git
git clone git://github.com/asaokamei/_ww.git
と打ち込んで、からgist-1460352内のcompare.phpを走らせてください。
測定ですが、Core2Duo 2.13GHzのWindows Vistaでの結果です。

2.2504210472107  // 素のPHP
5.0997409820557  // arry
9.1629009246826  // Underscore.php
7.959762096405  // _ww

予想通りarryが一番早かったです。
素のPHPに比べて2倍強になりました。結構、速い気がします。

意外だったのがUnderscore.phpより_wwのほうが速かったこと。
何度か走らせると、値が結構変わるので「ほんの少し速い」だけですが、各メソード内での処理が意外と重いのでしょう。

PHPのプロファイリング

そういえばプロファイリング(速度の測定)なんて何年振りです。
PHPだとxdebugを使えば出来るようですが、今回は簡単な関数を自作して計ることにしました。最近使い始めたNetBeansから直接測定結果が見られると便利なんですけどね。

0 件のコメント: