というわけで、間が空きましたがVer 0.82のリリースです。
今回の変更点は、
・バグフィックス
・sprintfの改修
・パフォーマンスの改善
になります。
また、今回のリリースからホスティングサイトをSourceforge.JpからSourceforge.netに変えました。
sprintfの改修ですが、詳しくはsprintfのマニュアルをご参照頂くとして、たとえばDBからの戻り値をsprintfで成型する場合に、便利に使えるようにしています。
例えば、以下のように記述することができます。
,db.sql@("SELECT * FROM users WHERE hogehoge ",[]).each.
sprintf("%s:first_name; %s:secondname;様 の誕生日は、%s:birth_dayです。").
prtn,next;
DBの取得から成型、表示まで一気に書けるところがAnother Data Processorらしくなかなかよろしいかと思います(自画自賛)。
パフォーマンスの改善ですが、Ver 0.60以来の改善になります。
Ver 0.60から0.81になったことでパフォーマンスが下がりましたが、Ver 0.82は0.60以上のパフォーマンスになりました。
前回と環境が変わりましたので改めてベンチマークをとりますと、
◆Windows上でのJavaScript vs ADP
■マシン
・CPU Core i7-920(2.66GHz HT/Turbo Boost OFF)
・メモリ 12GB(DDR3-1066 2GB × 6)
・OS Windows 7 Ulitimate (x64) 電源管理:高パフォーマンス
■結果
IE8(64ビット版) | 452ミリ秒 |
FireFox 13.0.1 | 12ミリ秒 |
ADP 0.60(32ビット) | 343ミリ秒 |
ADP 0.81(32ビット) | 452ミリ秒 |
ADP 0.82(32ビット) | 265ミリ秒 |
0.60と比べても20%以上速くなっています。今回はChromeの結果を掲載していません。またFireFoxですが、12ミリ秒とかなり速いです。前回パフォーマンスについて『FireFox3.6未満』と記載しましたが、残念ならがFireFoxと比較するのは厳しくなりました。
という訳で別の比較が必要になりましたので、ADPと、PHP、Javaと比べてみます。
◆CentOS6.2上でのPHP,Java,ADP
■マシン
・CPU Core i7-980X(3.33GHz HT/Turbo Boost OFF)
・メモリ 24GB(DDR3-1066 4GB × 6)
・ホストOS Windows 2008R2(Hyper-V)
・ゲストOS CentOS 6.2(実行環境)
■テストコード
テスト1:28のフィボナッチ数を求める PHPソース(Test1.php) Javaソース(Test1.java) ADPソース(Test1.p)
テスト2:10万までの素数を求める PHPソース(Test2.php) Javaソース(Test2.java) ADPソース(Test2.p)
テスト2のPHPのコードですが、Stackoverflowさんのコードを使わせて頂きました。
■結果(timeコマンドのuser部分を抜き出した)
テスト1 | テスト2 | |
---|---|---|
PHP(5.3.3) | 207ミリ秒 | 31,915ミリ秒 |
Java(1.6) | 38ミリ秒 | 4,862ミリ秒 |
ADP(0.82) | 190ミリ秒 | 3,765ミリ秒 |
テスト結果をみますとADPはPHP5.3以上のパフォーマンスが出ています。特にテスト2の結果が1桁近く速くなっており、Javaよりも早くなっています。テスト1ではADPよりJavaが圧倒的に速いのですが、テスト2ではADPの方が速くなっています。テスト2のJavaはコレクションクラス(ArrayList)を使っておりその分遅くなっているようです。実際にこの部分を固定配列にすると実行速度は1/10になります(もっともコレクションクラスを使わないという選択肢はないかとも思いますが)。ADPの配列はC++で実装しています。私自身気づいていませんでしたが、かなり効率良く実装されているようです。
また、テスト2の、リンク先のトピックは元々「PythonがPHPより遅いのだが?」という質問でしたがADPのパフォーマンスはそれ以上なのでいわゆるスクリプト言語より速いことが解ります。
もっとも一部のテストからですので今後も色々ベンチマークテストを行い検証しようかと思います。
ちなみに、もっと大幅にパフォーマンスアップが望める改善策を思いついたのですが、かなりの改修が必要なので、ここまでの成果を0.82としてリリースし、より速くしたものを後のバージョンで出そうかと思っています。打倒JavaScriptですね(まぁJITを入れないとダメなような気がするが・・・)。