忙しさにかまけてブログの更新を怠っていましたが、気がつけば今月末でADP公開2周年になります。公開一周年記念の記事も完成していないのに、時の立つのは速いものだと感慨に浸っております。
というわけで、間が空きましたが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) 電源管理:高パフォーマンス
■結果
28のフィボナッチ数を求める時間
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部分を抜き出した)
Linux(CentOS6.2 x64)上でのPHP(5.3.3)、Java(1.6)、ADP(0.82)の比較
| テスト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を入れないとダメなような気がするが・・・)。
最近オープンしたネコカフェですが、ぼちぼちやていますが、多くの道行く人が猫の呼び込みをみて「あら~かわいい~」と立ち止まるところをみていると、この国は相当病んでいるのか・・・と変な邪推をしてみたり、病んでいるといえば、とあるSNSゲームを知人から誘われはまり、少し課金アイテムを買ってみたりしたり、そういえば前回リリースから誕生日を過ぎたとか、その前回リリースからあまり間が空いていませんが、ADPのVer0.81をリリースします。
変更点は以下のとおりです、
・バグフィックス(DBライブラリ、~演算子、他)
・式のコンパイルの改善
・テンプレート機能の変更(ヒアドキュメント化)
・インクルード機能の変更(インクルードキーワードの変更)
・コマンドラインオプションの追加と変更(ワーニング、構文チェックの追加と引数のコード実行のオプション値の変更)
式のコンパイルの改善ですが、以前のバージョンではハッシュ検索のコンパイルがちょっと不完全でしたので、きちんと木構造をたどるようなコードに変更しました。おかげで、
$hash['key1']['key2']
というようにハッシュ検索の戻り値からさらにハッシュ検索ができるようになりました。
テンプレート機能をヒアドキュメントのように文字列として扱えるように変更しました。このおかげでWEBページモードの実装が単純かつ一貫性を持つようになりました。
テンプレートの開始ですが、
%>
となります。終了は
<%
となります。
JSPやASPのように<%がコードの始まりで、%>がコードの終わりになりますが、ADPも同様になります。ただし、ADPの場合は<%でコードが始まる時は、式の中になっていますので、それを抜ける為に、
<%;
という具合に、;を追加します。
なぜわざわざこのようにしたのかといいますと、テンプレートの機能をヒアドキュメントのようにして、統一的に使えるように言語仕様の中に入れてしまいたかったからですが、そのおかげでADPにはテンプレートライブラリを別に用意することが不要になります。
例えば、メール送信のようにテンプレートを用意してその中に値を張り付けるということがWEBページを作ることと同じようにできます。
ちなみにテンプレート(ヒアドキュメント)の開始、終了について他のテンプレートライブラリからの移行を考慮して将来的には変更可能なように実装しようかと考えております。
この変更に伴い、インクルードキーワードが合わせて変更になりました。
ちなみにインクルードは、トップレベル(ホーン節やゴール節の定義場所)で、
@includeファイル名@
で行います。
ちなみに、このあたりは仕様変更があるかと思いドキュメント化していませんでしたが、しばらく様子をみて特に変更の必要がなければドキュメント化します。
そのほか地味なところでは、コンパイルエラーやワーニング、ランタイムエラーの見直しを行っています。
不親切な言語仕様を改めてよりエラーやワーニングを出すようにしています。ワーニングは今回のバージョンから追加になります。
これで、いよいよ次はリソースの解放機能を追加しようかと思ってますが、実現できるかな?
「しゃべってコンシェルジュ」に『楽して儲ける方法を教えて!』と聞きたい衝動を抑えていたり、TopCoderは何とかRound2へ進んだが多分このあたりで敗退だろうと弱気になっているとか、その癒しをもとめて何気にネコカフェ始めたり、そのネコが今日は客が来ないとわめいていたり、ネコと言えば、ここ2か月程ブログがネコネタ2件とさびしい限りでしたが、やっとこさ ADP の Ver0.80 をリリースします。
上司からオークションサイトを作成せよと言われ、ADPでぼちぼち作っていたのですが、Ver0.79のリリース以降バグが出るわ出るわで、たくさんのバグを修正しました。
以前にだじゃれクラウドのAPIもADPで作成しその時もデバッグが進んだのですが、この手のソフトは実践が大事というのを実感しました。
ちなみに変更点も以下のとおりそこそこあります。
・バグフィックス
・例外発生時にスタックトレースを出力
・合わせてcatch述語の仕様を変更
・HTMLのファイルのアップロード(マルチパート)に対応
・configureの試験的導入
・erase_global / erase_session述語の追加
・コマンドライン引数の変更
・CentOS6.2のバイナリ版の追加
アプリを開発して実感したのですが、エラー関連の処理が不親切で、それに合わせて従来falseとしていたものをいくつかランタイムエラーにしました。
また、間違い易い文法があり、その部分についてはワーニングを出したいところです。これについては今後の課題です。
続いて別のWEBアプリケーションの開発を行う予定ですので、今後、もう少し品質が上がるかもしれません。
機能的な追加は今回も行えていないので次期バージョンでは何か実装したいところです。
2012 TopCorder OpenのRound1A,B が不本意な結果となり、『お前大丈夫か?』的な状態になっていたり、Excel2007以降のファイル形式(xlsx)が実はZIPでしたというのを最近知ったとか(その中身がxmlというのは知識として知っていた)、
SQLのパフォーマンスの記事について知り合いから質問を受けそういえば記事を書き足そうかと思っていたのを思い出したとか、そんなことを言えばADPの公開一周年記念記事がかけてないとか、ADPといえば、ADPの3月のリリースがなかったですが4月にはリリースしたいとか、いろいろ書くことがあるのですが、3月に続き4月の一発目(?)もネコネタで、
うちのちゃちゃですが、ミミと仲が悪く最近では毎日のように喧嘩をしていたのですが、そのせいか私の不注意か、ドアを修理していた隙を見て家出をしてしまいました。
当初家出に気づかずにどこかに隠れていると思っていたのですが、丸一日経っても出てこないので嫁さんが近所を探したら野良猫と睨みあっているのを発見しました。
嫁さんの必死の説得にもかかわらず本人は一向に家に帰る気配を見せず、私の顔をみたら『あなたとは終わったのよ』的な感じで逃げ出す始末で腹が立つやら嘆かわしいやらで悶々としていたのですが、嫁さんから『そんなんやったら
プロに頼もう』ということで、潔く
プロに頼みました。
やり方ですが、基本的には捕獲器で捕獲するのですが、どの場所に捕獲器を置くかということでちゃちゃの居場所を探し回りました。
探偵さんと手分けして休憩を入れつつ5時間ほど探したのですが残念ながら見つからずとりあえずうちの裏の方で捕獲器を置きましたところ今朝ほど無事(?)に捕獲されました。
情けない顔で、きゃんきゃんと鳴いていましたが、出してやるとあまりのくつろろぎぶりで、『お前今まで家出してたんとちゃんか?』と突っ込みたくなりました。
ちなみに家出中の写真を撮る余裕はありませんでした。