[ADP開発日誌]Ver 0.81のリリース

最近オープンしたネコカフェですが、ぼちぼちやていますが、多くの道行く人が猫の呼び込みをみて「あら~かわいい~」と立ち止まるところをみていると、この国は相当病んでいるのか・・・と変な邪推をしてみたり、病んでいるといえば、とあるSNSゲームを知人から誘われはまり、少し課金アイテムを買ってみたりしたり、そういえば前回リリースから誕生日を過ぎたとか、その前回リリースからあまり間が空いていませんが、ADPのVer0.81をリリースします。

変更点は以下のとおりです、
・バグフィックス(DBライブラリ、~演算子、他)
・式のコンパイルの改善
・テンプレート機能の変更(ヒアドキュメント化)
・インクルード機能の変更(インクルードキーワードの変更)
・コマンドラインオプションの追加と変更(ワーニング、構文チェックの追加と引数のコード実行のオプション値の変更)

式のコンパイルの改善ですが、以前のバージョンではハッシュ検索のコンパイルがちょっと不完全でしたので、きちんと木構造をたどるようなコードに変更しました。おかげで、
$hash[‘key1’][‘key2’]
というようにハッシュ検索の戻り値からさらにハッシュ検索ができるようになりました。

テンプレート機能をヒアドキュメントのように文字列として扱えるように変更しました。このおかげでWEBページモードの実装が単純かつ一貫性を持つようになりました。
テンプレートの開始ですが、
%>
となります。終了は
<% となります。 JSPやASPのように<%がコードの始まりで、%>がコードの終わりになりますが、ADPも同様になります。ただし、ADPの場合は<%でコードが始まる時は、式の中になっていますので、それを抜ける為に、 <%; という具合に、;を追加します。 なぜわざわざこのようにしたのかといいますと、テンプレートの機能をヒアドキュメントのようにして、統一的に使えるように言語仕様の中に入れてしまいたかったからですが、そのおかげでADPにはテンプレートライブラリを別に用意することが不要になります。 例えば、メール送信のようにテンプレートを用意してその中に値を張り付けるということがWEBページを作ることと同じようにできます。 ちなみにテンプレート(ヒアドキュメント)の開始、終了について他のテンプレートライブラリからの移行を考慮して将来的には変更可能なように実装しようかと考えております。 この変更に伴い、インクルードキーワードが合わせて変更になりました。 ちなみにインクルードは、トップレベル(ホーン節やゴール節の定義場所)で、 @includeファイル名@ で行います。 ちなみに、このあたりは仕様変更があるかと思いドキュメント化していませんでしたが、しばらく様子をみて特に変更の必要がなければドキュメント化します。 そのほか地味なところでは、コンパイルエラーやワーニング、ランタイムエラーの見直しを行っています。 不親切な言語仕様を改めてよりエラーやワーニングを出すようにしています。ワーニングは今回のバージョンから追加になります。 これで、いよいよ次はリソースの解放機能を追加しようかと思ってますが、実現できるかな?

[ADP開発日誌]Ver 0.80のリリース

「しゃべってコンシェルジュ」に『楽して儲ける方法を教えて!』と聞きたい衝動を抑えていたり、TopCoderは何とかRound2へ進んだが多分このあたりで敗退だろうと弱気になっているとか、その癒しをもとめて何気にネコカフェ始めたり、そのネコが今日は客が来ないとわめいていたり、ネコと言えば、ここ2か月程ブログがネコネタ2件とさびしい限りでしたが、やっとこさ ADP の Ver0.80 をリリースします。

上司からオークションサイトを作成せよと言われ、ADPでぼちぼち作っていたのですが、Ver0.79のリリース以降バグが出るわ出るわで、たくさんのバグを修正しました。
以前にだじゃれクラウドのAPIもADPで作成しその時もデバッグが進んだのですが、この手のソフトは実践が大事というのを実感しました。
ちなみに変更点も以下のとおりそこそこあります。

・バグフィックス
・例外発生時にスタックトレースを出力
・合わせてcatch述語の仕様を変更
・HTMLのファイルのアップロード(マルチパート)に対応
・configureの試験的導入
・erase_global / erase_session述語の追加
・コマンドライン引数の変更
・CentOS6.2のバイナリ版の追加

アプリを開発して実感したのですが、エラー関連の処理が不親切で、それに合わせて従来falseとしていたものをいくつかランタイムエラーにしました。
また、間違い易い文法があり、その部分についてはワーニングを出したいところです。これについては今後の課題です。

続いて別のWEBアプリケーションの開発を行う予定ですので、今後、もう少し品質が上がるかもしれません。
機能的な追加は今回も行えていないので次期バージョンでは何か実装したいところです。

[ADP開発日誌 ]Ver 0.79 リリース

今年、一発目のリリースになります。
ちょっと間が開いたせいでもないですが、結構な修正が入りました。

・Mac OS X 対応
 Mac OS X上で、platfome述語は”MAC OS X”の文字列を返す。
・eval,sandbox述語の追加
 文字列のコンパイル実行(eval)
 コンパイル実行を制限モードで行う(sandbox)
・一括取得の述語、selecta,sqla述語の追加
 結果を全て取得する場合、selectやsqlよりメモリ効率がよい。
・goal節の開始の,(カンマ)が不要になった。
・Linux上でのpipe述語のパフォーマンス改善

大きなところで、Mac OS Xの対応があります。
今年の初売りでMac Book Airを買ったのですが、しばらく放置していましたが、もったいないので少しずつ使うようになりました。

OS Xですが、開発環境構築に結構苦労しました。以下、愚痴がてら簡単な覚書ということで、
私が使ったのは現在の最新の開発環境Xcode4.3とMacPortsの組み合わせなのですが、Xcode4.3をApple Store経由でインストールしたのですが、コマンドラインツールに関しては別途インストールする必要があり、ネットを探し回って、このページにたどり着きました。
要するにXcodeの統合開発環境からPreferencesをたどり、Command Line ToolsをダウンロードすればOKとのことでした。
ネットをみる限りMacの開発環境はよく変わっているらしくそれはそれで良いのでしょうが、コンパイル環境に関して変更するのも如何なものかと思います。ちなみにWindowsの場合、Visual C/C++はコマンドラインツールに関して言えばDOS時代から変わっていませんし、Linuxにしてもgccを使う上では同様かと思います。

また、Xcode4.3の付属のコンパイラはLLVM-GCCと呼ばれるもので、GCCとは別のコンパイラになります。ADPのコンパイル程度でしたら結構互換性は高いようですが、1点苦労したのが、TLS(Thread Local Storage)が未サポートということで自分で、pthread_setspecificを使って実装しました。
『いや・・・オレもTLS使うのはじめてだが、TLSって20世紀から存在したかと思うのだが・・・gccといいながらunsupported target とか言われても・・・。』
と愚痴りながらpthread_setspecificのマニュアルと格闘しました。いやgccなら __thread 一発で終わるのに・・・。

その他、ADPは、unixODBCを使っているのですが、とりあえずバージョン0.79ではMacPortsからunixODBCをインストールしています。
ただ、MAC OS Xの場合、iODBCを使用しているらしくこのあたりはひょっとしたら将来変更があるかもしれません。

MAC OS Xの場合、32ビットOSでも64ビットバイナリが動作可能のようで、実際に試したところ32ビットOS上で64ビットのバイナリが動作したので、64ビットバイナリのみ用意しています。これについては他のプラットフォームにはない長所ですごいと思いました(どうやっているんだろうという疑問があるのですが・・・)。

とまぁこんな感じでまだまだ実験的にサポートした感は否めませんが取り合えず OS Xもサポートするようになりました。

[ADP開発日誌 ] あけましておめでとうございます。

2012年も6日が過ぎようとしていますが、いまさらながらあけましておめでとうございます。
初売りのMac Book Airを買ったり、ニッチンを大人買いしたり、色々書くことはあるのですが、ADP関連の報告を。

去年、だじゃれクラウド開発していたメンバから『今年はADPを広めましょう』ということで、今年は少し活動の幅を広げます。

■ ロゴ
ロゴを作って頂きました。
新しいロゴは、

になります。個人的には結構気に入っております。
というわけで、ADPの正式名称は、大文字でも小文字でも良いということになりました。

■ SNSの作成
露出度を上げる為にtwitterとfacebookに登録しました。

・ twitterアカウント
http://twitter.com/#!/adp_la

・ facebookページ
https://www.facebook.com/adp.la

■ sandoboxプロジェクト(仮)
今年の目玉の1つですが、ADPが使えるフリーのレンタルサーバーを立ち上げます。
とにかく使ってもらわなければ意味がないので、ADPを試す機会を増やそうということでやってみます。

■ 分散環境対応
これは元々ロードマップにあったものですが、去年の年末頃にVer1.0ではやめにしたのですが、別の人から『分散コンピューティング環境が欲しい』との要望を受けてやっぱり開発をしようかと思いました。
利用者が付いて貰えるのはありがたいので、こちらもなるべく実現するようにがんばります。

[ADP開発日誌 ]Ver 0.78 リリース

iPhoneを買ったとか、T1028のメモリ4GB計画は失敗したとか、書くことはあるのですが、ADPの0.78をリリースしましたのでその告知を。

今回のリリースですが、env述語のバグFIXのみで、今までの中でもっとも変更点が少ないリリースになります。
公にはしていませんでしたが、月1でリリースしようと決めていましたので、1点だけの変更ですがリリースします。

ちなみに、今回のリリースでは間に合いませんでしたが、対応マシン(コンパイル済みのバイナリ)にMAC(intel Mac)を追加しようかと思っています。iPhoneも買ったことだしこれで私も一人前のAppleユーザとして旅立とうかと思とります。

また、とある人から『はやくバージョン1を出せ。」と言われましたので、若干ですが方針変更をします。今まではマルチスレッド対応を優先しようかと思っていましたが、リソース開放機能を優先して開発します。で、このリソース開放機能の実装をもって バージョン1.0としようかと思ってます。
まぁ、バージョン番号自体にこだわりは無かったので、ユーザというかプロジェクト関係者というか関わる人が増えたのでその意向を取り入れる形になってます。ちなみにリソース開放機能についてはADPの構文が変更になる可能性があるのでこれについては外せないということで実装します。

[ADP開発日誌 ]Ver 0.77 リリース

ADP 0.77のリリースです。またもや地味な改善になります。
ダジャレクラウドプロジェクトからのフィードバックがメインになります。

・バグフィックス
・シングルスレッド動作時のパフォーマンス改善
・size述語の変更
・eload / esave述語の追加

今のところ、ダジャレクラウドのサーバーはADPで作成していますが、実践で使うとちょこちょこバグが見つかるようで、今回のリリースでもバグフィックスが入っています。
0.74のマルチスレッド対応時に、メモリの取得・開放時にロックを掛けるように変更しましたが、シングルスレッド動作時には単にオーバーヘッドになるだけですので、フラグを用いてロックする(マルチスレッド動作時)、ロックしない(シングルスレッド動作時)としました。
今更ですが、文字列の長さを求める述語がなかったので、size述語(配列の要素数を求める)を拡張して文字列が指定されたら長さ(バイト数)を返すようにしました。
eload / esave は、主にADPのCGIモードのデバッグ用で、esaveで実行環境(環境変数、QUERY変数、COOKIE)を保存し、eloadで復元します。ADPをgdbでデバッグするときにeloadでCGIの環境を復元しデバッグを行います。

ちなみに、1揃えの11月11日にリリースしようかと思っていましたが、失念していて今日のリリースになりました。

ダジャレクラウドのリリース

以前、ブログに書いていたダジャレクラウドですが、晴れてリリースとなりました。
 
遊び方ですが、『ダジャレ・リサーチ』というテキストボックスにキーワードを入力し、検索ボタンをクリックするという至ってシンプルなものになります。
ちなみに最近私が面白いと思ったものは『オリンパス』で検索したものです(まぁ少々ブラックですが・・・)。
 
ソフトウェア開発の常なのですが、このプロジェクトも遅延しましたが何とか無事にお披露目できるようになりました。
あまり赤裸々に書くのも如何なものと思われるかと思いますが、こういった経験は私自身も肥やしになるのと、あまり外には聞こえてこないもので興味深いと思いますので、適当にフィクションを入れつつ記事を書いてみます。ので以下はフィクションと思って頂ければと思います。
 
■ プロジェクトの目標がはっきりしているか?ぶれないか?
 もともとHack4JPという震災復興プロジェクトの1つとして立ち上がりましたが、『だじゃれ』と『震災復興』というあまりにもかけ離れたお題に対して一部のメンバーが動機付けに苦労し余計な時間を費やした点が上げられます。
つまり、プロジェクトだじゃれという不謹慎なものに対して負い目を感じ、それに対して大義名分をつけようとして『開発を行う』というエンジニアの本分を忘れてしまい結局開発に手が付かなかった点があります。
結局は、『ダジャレで被災者を応援しよう』という当初の目標に落ち着き混乱が収拾されました。
 
■ボランティアに対するスタンスの違い
 私はこういうボランティアは始めてなのですが、メンバー間のボランティアに対する認識の違いがありました。
私の中では、参加条件が『プロが無償でする』であり、その方が『出来る範囲で出来ることをする』という認識でいました。
『プロが無償でする』というのはどういうことかと申しますと速い話がボランティア(タダ)といってもいい加減な仕事をしてはいけないということで、例えますと英語ができない人が通訳のボランティアをやっては逆に迷惑でしょう。ということです。
つまりソフトウェア開発プロジェクトなら開発ができる人が開発を行うということなります。
当たり前ですが、どのようなソフトウェア開発プロジェクトも開発者だけ回りません。リーダーやプランナーの方とう様々な役割をもった方も必要です。チームとして活動する場合はそういったリーダーやプランナーとして仕事ができる人も参加する必要があるでしょう。

プロジェクトの混乱の1つにこのスタンスの違いがありました。つまり、無償で作業をするという認識は一致していたかと思いますが、「プロ」の部分が抜けておりました。先ほどの英語の例でいいますと英語がしゃべれないけど通訳のボランティアをするといった具合です。もっとも明らかにしゃべれないなのらヤメトケで済みますが、微妙な場合は線引きが難しくこれが混乱の元になりました。
『できるかどうか解らないがやってみる』というのはありかと思いますが、その場合は周りに迷惑にならない程度に『やっぱりできませんでした』とか『ここまでならできました』とかの報告が欲しいものです。
ボランティアに限った話ではないですが、厄介なのが充分な能力をもっていないが自分はできると思っていたり、『出来ません』と言えずに引くに引けないようになってプロジェクトが停滞しました。

この点のもう1つの問題が、メンバーの意識として『出来る事をする』ではなく『したい事をする→出来ないことをやろうとする』になってしまう点です。これが復興支援という大義名分と融合して混乱に拍車をかけた部分があります。当たり前ですが、ほとんどの日本人(世界の人)が東北の方の1日でも速い復興を願っています。前項とも絡んでくるのですがその思いが空回りして、したい事をプロジェクトとして実行させようとし結果として、出来ないことをやろうとすることになっていました。

■ボランティアに対するスタンスの違いとプロジェクト運営の経験不足
 そもそも論としてボランティアだからモノを完成させる必要はないという認識の方もいらっしゃいました。こういう考え方自体は悪くないかと思いますが、少なくとも依頼者は完成させて欲しいと思っていますし、また、メンバー内にも完成させたいと思っている方も当然居ました。この場合は明らかに完成に向けて作業を行う必要があるかと思いますが、そういった中でご自身の意見を優先される方がいらっしゃいました。
個人の意見がプロジェクト運営上妨げになるという場合、その点については当然調整を行う必要があるでしょう。つまりある部品の開発者であったが興味を失ったので開発はもう終わりにしたいと思った場合、別の開発者に任せるようにする必要があるでしょう(本来ならある程度完成させてから抜けるのが筋だと思いますが・・・)。それをプロジェクトとして完成させる必要がないとされると周りの者が迷惑をこうむります。

■文化の違う方とのコミュニケーション
 立場の違う人達が集まると波風が発生するもので、上記の認識の違いやら、果ては言葉遣いや段取り等の違いから波風が立ちました。
このプロジェクトですが見た目が簡単で面白そうなのでエンジニアでない方も入ってこられました。
それ自体は悪くはないですが、例えば、システム開発で発注者の立場の人と受注者の立場の人がボランティアで一緒になるとほぼ立場が逆転します。なぜなら発注者というのはお金という力を使って受注者をある意味支配していますが、ボランティアベースになるとお金という力がなくなるので、別の何かで開発者の方と協力しあわなければなりません。
こういったところでコミュニケーション不足が一部にありメンバーの不満が高まったこともありました。
この点については幸いにも粘り強く話しをしたら誤解であったことが解り、開発者でない方のプロジェクトに対する貢献方法(広報活動だったりプロジェクトの企画だったり)を考えることにより作業が進行できたので、1つ収穫になりました。

とまぁ色々問題が発生しましたが齢40を過ぎていい社会勉強になりました。

[ADP開発日誌 ]Ver 0.76 リリース もろもろ

 ブログの方ですが、一周年記念記事やSQLのパフォーマンスの記事が、遅々としてはかどっていませんが、ADPのリリースがありましたので更新してみます。
今回は、幾つかのバグフィックスとソート述語、pow(べき乗)述語を追加しています。
以前の記事で、マルチスレッドの充実やらリソース開放機能の追加などを予定していましたが、地味な改修にとどまっています。が方々でADPを使おうと画策しております。
まず、SQLのパフォーマンスの記事はADPを使って実験しています。ちなみにソート述語はその関連で追加しています。

また、以前に紹介しましただじゃれくらうどですが、これのWEB-APIをADPで作成したりしております。現在リリースに向けて作業中だったりします。

べき乗の追加はなんだと思われるかもしれません。最近知ったのですが、Googleさんの方でCode Jamという、プログラミングコンテストをやっておられるのですが、コンテストで使用するプログラミング言語にある程度自由度があり、であればADPでやりましょうということで、次の目標を『Code JamをADPで参加する』ということにしました。
その関連で少しずつですが、Code Jamにも耐えられるような言語ということで改修しています。
ちなみにですが、今年はC++で参加しました。

[ADP開発日誌 ]Ver 0.75 リリース バグフィックス

 ブログの方ですが、一周年記念記事の追加やSQLのパフォーマンスの記事等ちょっととっちらかった感がありますが、ADPのVer 0.75をリリースします。

基本的にバグフィックスになります。
・insert / update / delete でメモリリークのバグフィックス
・組込み述語(_table_quote)を削除し、組込み述語(_db_quote / _db_default_quote)を追加した。

SQLのパフォーマンスの記事のアップに際して環境を整えましたが、その際にデータのコピーをADPでやらせてみたところバグが発覚したので修正しました。
またSQLServerからMySQLにデータをコピーするに際してクオート文字の指定が_table_quoteだと不完全なので整理しました。

ちなみに、insertの性能ですが、悪いです。
MySQLやSQLServer2008以降では、多数の行をインサートするために、マルチプルインサート、Oracleではマルチテーブルインサートが使えるので、検討してみたい(専用の述語の追加になるか?)。

[ADP開発日誌]0.74リリース マルチスレッド化の第一歩 & LLPlanets発表用リリース

ADP公開一周年記念記事がまだ途中ですが、
Ver0.74
のリリースを行います。


Ver0.74
は、Accessでの整数のインサート時のエラーの改修と、pipe述語の実装があります。
pipe述語というのは、以前話に出ました、マルチスレッド機能の1つでパイプライン処理を実現する述語になります。
ちなみに、本リリースにに基づき、LLPlanetsのライトニングトークで発表を行います。私を見かけた人は『ブログ見てます』と声を掛けていただければうれしかったりします。

では、pipe述語の使用例を見てみましょう。何回かやっていて最近ホットなSQLのパフォーマンスについての例になります。
関連記事1:[ADP開発日誌]SQL(JOIN)の実行パフォーマンスについて2011
関連記事2:SQLの実行パフォーマンスについて 2010

実験環境

JOINのパフォーマンス実験環境はこちらに記述しています。

実験1 素直にSQL側でjoinをさせたものを実行(再掲)

例により、SQLで素直にjoinさせてみます。以下のようなコードになります。

,$db = "DSN=Trade"
,$str = "SELECT Price.CODE, RDATE, OPEN, CLOSE, NAME FROM Price "
        "INNER JOIN Company ON (Price.CODE = Company.CODE)"
,sql@($db,$str,[]).csv.prtn,next;

 
[ADP開発日誌]SQL(JOIN)の実行パフォーマンスについて2011の実験1と同じです。
実行時間も同じで、約119秒です。

実験2 ADP側でjoin(ネステッドループ&キャッシュ)

続いて、ネステッドループjoinをADPのキャッシュ機能を使って高速化をはかります。
 

,$db = "DSN=Trade"
,$price = "SELECT CODE,RDATE,OPEN,CLOSE FROM Price"
,$company = "SELECT NAME FROM Company WHERE CODE = ?"
,sql( $db, $price, [], @rec)
 ,pipe
 ,sql( $db,$company, [$rec[0]], $name)
  ,csv($rec,$name).prtn,next;

 
[ADP開発日誌]SQL(JOIN)の実行パフォーマンスについて2011の実験2-Bと同じコードになります。
実行時間ですが、約117秒となりました。実験1と比べて約1.6%程速くなっています。

実験3 ADP側でjoin(事前にマップ作成)

3つ目は、ADPでも事前にマップを作成し、joinを行うことができます。

,$db = "DSN=Trade"
,@tbl = {}
,sql($db, "SELECT CODE,NAME FROM Company",[], @r)
 ,@tbl = @tbl + [ $r["CODE"] | $r["NAME"] ]
 ,next
,sql($db, "SELECT CODE,RDATE,OPEN,CLOSE FROM Price",[],@rec)
 ,$key == $rec["CODE"].str
 ,csv($rec,$tbl[$key]).printn,next;

 
[ADP開発日誌]SQL(JOIN)の実行パフォーマンスについて2011の実験3と同じコードです。
実行時間ですが、約111秒で実験1より7%ほど速くなっていることが解ります。

続いて、pipe述語を使って並行処理をさせてみます。

実験1-P 素直にSQL側でjoinをさせたものをpipe実行

実験1のコードにpipe述語を挿入しています。

,$db = "DSN=Trade"
,$str = "SELECT Price.CODE, RDATE, OPEN, CLOSE, NAME FROM Price "
        "INNER JOIN Company ON (Price.CODE = Company.CODE)"
,sql@($db,$str,[]).pipe.csv.prtn,next;

実験1のコードとの違いは4行目の
,sql@($db,$str,[]).pipe.csv.prtn,next;
のpipeという記述で、これがpipe述語になります。pipe述語で区切られたコードは並行で処理を行います。
つまり
,sql@($db,$str,[])
の部分(バックトラックの実行)と
.csv.prtn,next;
の部分は並行で動作します。
sqlの部分は、.csv.prtn,nextの実行中にバックトラックを行います。
next述語で、pipeまで戻りますと、sqlの実行を待ち(同期)データを受け取ります。
ややこしいかも知れませんが、図で示すとよくわかるかと思います。

図で、青の矢印の部分と赤の矢印の部分がそれぞれ別のスレッドになっており平行で動作しています。
pipe述語が無い場合の動作イメージは以下のとおりです。

比較してみますと分かりますが、sql述語~next述語まででループがありますが、それを2つに分けて実行するイメージになります。
UnixのシェルやWindowsのコマンドプロンプトで、|(パイプ)を使ってコマンドをつなげることがありますが、pipe述語の実行イメージはこれと同様になります。
シェルのパイプ(|)は20年以上前からあり、お手軽にマルチタスク処理を実現できるのですがプログラム言語レベルで使えるものがなく、マルチスレッドプログラムとなるとなぜかややこしくなります。
ADPではお手軽にマルチスレッドプログラムを体験して頂くため、その一つとしてパイプを実装しました。

実行時間は、約108秒で、約9%速くなっています。少しですが実験3よりも速くなっていることが解ります。

実験2-P ADP側でjoin(ネステッドループ&キャッシュ)でpipe実行

続いて、実験2のコードにpipe述語を挿入しています。

,$db = "DSN=Trade"
,$price = "SELECT CODE,RDATE,OPEN,CLOSE FROM Price"
,$company = "SELECT NAME FROM Company WHERE CODE = ?"
,sql( $db, $price, [], @rec)
 ,pipe
 ,sql$( $db,$company, [$rec[0]], $name)
  ,csv($rec,$name).prtn,next;

実行時間は、約89秒で実験2と比べて約24%速くなっています。
興味深いのは実験1-Pよりも速度向上が大きいです。pipe述語は半分に分割してそれぞれ実行するという方式をとっていますが、当然ですが常に半分になるとは限りません。上手く半分に分割できる場合もありますし、そうでない場合もあります。そのような関係でこのような逆転現象が発生します。一口にJOINのパフォーマンスといってもこのように様々な要因が絡んできますので、一概に『○○が効率的』といえないことを表す良い例となっています。

実験2-PP ADP側でjoin(ネステッドループ&キャッシュ)でpipe実行2

実験2-Pのコードにさらにpipe述語を挿入しています。pipe述語は1つだけでなく複数入れることもできます。

,$db = "DSN=Trade"
,$price = "SELECT CODE,RDATE,OPEN,CLOSE FROM Price"
,$company = "SELECT NAME FROM Company WHERE CODE = ?"
,sql( $db, $price, [], @rec)
 ,pipe
 ,sql$( $db,$company, [$rec[0]], $name)
  ,pipe
  ,csv($rec,$name).prtn,next;

実行時間は、約112秒で実験2-PPと比べて逆に遅くなっています。このように闇雲にマルチスレッドを行っても必ずしも速くならない場合がある(もちろん速くなる場合もある)のが面白いところです。pipe述語を2つ使うと3つスレッドが動作しますが、実験環境ではCPUコアが2つしかないので足の引っ張り合いのようなことになったようです。

実験3-P ADP側でjoin(事前にマップ作成)でpipe実行

続いて、実験3のコードにpipe述語を挿入しています。

,$db = "DSN=Trade"
,@tbl = {}
,sql($db, "SELECT CODE,NAME FROM Company",[], @r)
 ,@tbl = @tbl + [ $r["CODE"] | $r["NAME"] ]
 ,next
,sql($db, "SELECT CODE,RDATE,OPEN,CLOSE FROM Price",[],@rec)
 ,$key == $rec["CODE"].str
 ,csv($rec,$tbl[$key]).printn,next;

実行時間は、約91秒で、実験3と比べて約18%速くなっています。

ちなみに実験3-Pからさらにpipeを挿入しても良いのですが、実験2-Pの時と同様にあまり速くならないので省略します。

結論

各実験結果を示します。

pipe述語の効果
実験 実行時間(秒)
実験1 119
実験2 117
実験3 111
実験1-P 108
実験2-P 89
実験2-PP 112
実験3-P 91

実験1~3どの場合でも、pipe述語が有効だということが分かります。これは、
・DBMSからデータを取得する
・ファイルへ書き出す
という2つのIO処理があり、pipe述語によって、それらを同時に実行することが出来る為です。
また実験2-PPと実験2-Pを比べても分かりますとおり闇雲にマルチスレッド化しても高速化が図れない場合もあります。
パフォーマンスアップは様々な要素が関わってきますので実験により確認しながらということが必要になります。
pipe述語はお手軽にマルチスレッドを実現でき、また取り外しも楽なので簡単に実験や試行錯誤が出来ます。
ADPのpipe述語はキャッシュ機能と同様に便利な道具として利用できるかと思います。

また、実験1-P、2-P、3-Pを比較しますとどれをとってもパフォーマンスにあまり差がないことがわかるでしょう。ADPの開発にあたりプログラマの自由度を高めるということも考慮しています。つまり、『○○でなければダメ』ではなく、どのアルゴリズムを採用するかはプログラマーの判断で、いか様にも選択できるような言語を目指しています。

追記:コメント欄での指摘およびテスト再現性を考慮してテスト環境を整備して再度計測しています。