前回のリリース告知からはや2ヵ月半が過ぎやっと述語キャッシュ機能を付けました。
キャッシュ機能ですが、同一の関数(述語)の呼び出し(評価)を行う場合に、1回目の呼び出しの結果を保存しておき、2回目の呼び出しでは1回目の呼び出し結果を使います。同一の判定ですが、述語名と引数の値が同じならキャッシュします。変数に関しては、値があればその値が同じか比較し、値がなければ同一とみなします(変数名が違っていてもキャッシュが有効になります)。
なので、printn関数のように副作用がある場合やrand関数のように毎回異なる値になることを期待する述語の場合はキャッシュ機能を使うとバグリます。つまりprintnの場合は2回目の画面出力が行われなくなり、rand関数の場合は同じ値を返して乱数でなくなります。
以下、フィボナッチ数例の値を求めるサンプルを例に、使い方を示します。
まずはキャッシュなし版のコード(fib1.p)で、
+fib(0,0);
+fib(1,1);
+fib($x,$y),fib($x - 1, $f1),fib($x - 2, $f2), $y == $f 1+ $f2;
,fib(25).printn;
以下、私のマシン(Core i7-920)での実行結果です。
D:>adp -t fib1.p
75025
time is 1538ms.
以下、キャッシュあり版のコード(fib2.p)で、
+fib(0,0);
+fib(1,1);
+fib($x,$y),fib$($x - 1, $f1),fib$($x - 2, $f2), $y == $f 1+ $f2;
,fib(25).printn;
以下、私のマシン(Core i7-920)での実行結果です。
D:>adp -t fib2.p
75025
time is 3ms.
キャッシュあり版のコードですがぱっとみた感じ違いが解らないかもしれませんが、fib述語を呼び出している部分『fib$($x - 1, $f1)』で、fib$ と述語名の終わりに $ が付いています。つまり、
述語名の後に $ をつけるとキャッシュ機能が有効になります。
キャッシュあり版となし版で、速度を比較しますとあり版が激速になっていることが分かるかと思います。
fib1.pフィボナッチ数例のコードですが、良く見るコードだと思いますが、このサンプルは実行速度の面で問題があります。2回再帰関数を呼び出しているので実行時間は、入力する値が大きくなると指数関数的に増えて行きます。
fib2.pの例で、キャッシュ機能を使いますと、再帰呼び出しが事実上1回になりますので、入力値が大きくなっても実行時間が指数関数的には増えなくなります。
キャッシュは万能でないので、fib2.pの例では、再帰関数を使う別の問題(大きな数を計算させるとスタックがあふれる)は解決できませんが、ADPのキャッシュ機能を使えば、コードを若干修正するだけでそこそこの性能が得られるので適用対象によっては有効な武器となるでしょう。
(ちなみにですが、フィボナッチ数例を求める実用的なコードではもっと別の実装を選択します。)
通常プログラムを高速化したいときですが、プログラマは追い込まれており、出来るだけお手軽にキャッシュ機能をつけたいと思います。また、不具合が出たときに取り外すのも手軽にやりたいと思います。このようなコンセプトの元、
ADPでは、関数(述語)の呼び出しそのものをキャッシュする機能
としてキャッシュ機能を実装しています。これは、なかなか便利だと思います。
次回は、別の例でキャッシュ機能を紹介します。
最近円高のニュースが続きますが、まぁ日本経済にとっては円高はよろしくないかと思いますが、あまり悪いことを考えてもなんなので、ITエンジニアにとっての円高のメリットを紹介します。
現在のPC関連のパーツですが、基本輸入品になりますので、円高のメリットを受けられます。
ちなみに、某価格比較サイトによりますと、1枚4GBのDDR3のDIMMが6千円を割り込むぐらいの値段になっていますし、6コアのCore i7 - 980Xが8万円台で買えます。これを軸にシステムを組みますと、
CPU:6コア、論理12スレッド(Core i7 - 980X)
メモリ:総合計 24GB(DDR3 4GB × 6 )
ちょっと前のサーバーなんか目じゃない、なんていう夢のマシンが20万円までで組めるのですごい時代になったもんだと感心します。
私もどうしようかと悩んでいるところです。もっとも今はメモリ24GBを使って何をしようかと思案中なのですが・・・。
前回の更新からすっかり間が空きましたが、10/17にあった英検の出来が良くなく、ダメージを受けていたオオフジです。もっとも次の日曜日にTOEICを受験するのでまぁ懲りずに勉強してます。
前にも引用したのですが、/.Jさんの記事から、
Windows 7 への移行の壁は、IE6 にあり
ビジネスユースでWindows7への移行が進まない理由としてIE6があるとのことですが、私のサイトのアクセスログを調べると、ここ10日程のデータになりますが、約40%のブラウザがIE6でした。
一応技術者向けの硬派なサイトを目指しているので、約40%というと意外に多いと思われますが、レガシーなものって意外にしぶとく残るもんで、他の例で言いますとフロッピーディスクやCSVファイルもしぶとく残っています。
ちなみに『C++/STLでCSVファイルの読み込み』がいまだにアクセス数1位なので、みなさんCSVファイルをまだ使ってらっしゃるのでしょう。
という訳で、わが社でサポートするブラウザも後しばらくIE6対応が続きます。
ここのところ更新をさぼっていましたオオフジです。書くネタがないことはなかったのですが、今月、英検がありまして勉強で地味に急がしいので更新をさぼってました。といってもあまりにも更新しないとアクセス数が下がるので更新します。
10月に入りまして国勢調査の時期になりましたが、一般的でないと思われる調査に、中小企業実態基本調査というのがあります。
詳しくは、
このページを参照頂ければよいのですが、平成16年から毎年行われているらしく今年はうちの会社にも調査がありました。
調査内容は、いわゆる決算の内容にプラスして、従業員の数やその他の質問があります。印象に残ったのは、『貸し渋りにあってますか?』とか『電子商取引の売上に占める割合は?』とかがありました。
調査結果もみることができまして、例えば、平成21年確報で
・売上高の内訳、産業別・従業者規模別表をみますと、情報通信産業の一人当たりの売り上げ高が、
法人企業 約1400万円
個人企業 約 500万円
となっているようです。IT産業の場合、個人企業というのはほとんどフリーランスのエンジニアだと思われますので、フリーランスのエンジニアの収入が約500万円といったところになるようです(もちろんあくまでも平均になります)。また法人企業の場合では外注やハードウェアの仕入れ等も行っていると思いますので一人当たりの売上高を計算すると個人企業よりも高くなるかと思います。
また、先ほど出てきました、電子商取引についてですが、
・電子商取引 産業別・売上高階級別表をみますと、全体的には、概ね
実績が上がらなかった | 10% |
売上高に占める割合が10%未満 | 50% |
売上高に占める割合が10%以上 | 25% |
まだやっていない | 15% |
とのことで、ECサイトに関してはこれからは、新規開発というより、売上アップの為のコンサル的な仕事の需要が増えるかと思われます。
もちろん私もその手のご相談にのることができますので、相談毎などありましたら
こちらにアクセス下さい(って最後の締めが宣伝か・・・)。