(この記事ははてなブログ http://mmyymmdd.hatenablog.com/ の再掲です)
2015-04-26
前回書いたループ性能を改善するためにAPIにそのための関数を追加し、ついでにリファクタリングしてみた。
終了判定されるまで変換関数を繰り返し適用する次のような関数をAPIに追加して、250msかかったものが140msになったが、10倍以上のスピードアップを期待していたので満足できない結果となった。
// 単純なループ(終了判定されるまで変換関数を適用)
VARIANT __stdcall repeat_imple( VARIANT* init , //初期値
VARIANT* pred , //終了判定関数
VARIANT* trans , //変換関数
__int32 maxN , //回数上限
__int32 scan , //履歴 or 結果
__int32 stopCondition); //終了条件
API側に個別目的の関数を追加するのは抵抗があったので他の方法を検討していたが、いい方法が思いつかなかったのでこうした。少し残念である。
C++側でループすることでファンクタの生成コストはほとんどなくなったはずなのに性能が伸びないのは、合成した関数の呼び出し方法そのものが悪いのだろうか。
VBAHaskellの紹介 その9 (明示的なループの性能がいまいち)
VBAHaskellの紹介 その1 (最初はmapF)
ソースコード:
https://github.com/mYmd/VBA
dllバイナリ:
https://github.com/mYmd/VBA/blob/master/bin/mapM (32bit-Office用)
https://github.com/mYmd/VBA/blob/master/bin/mapM64 (64bit-Officey用)