VBAHaskellの紹介 その10 (ループの性能が上がらない)

前回書いたループ性能を改善するためにAPIにそのための関数を追加し、ついでにリファクタリングしてみた。VBAHaskellの紹介 その9 (明示的なループの性能がいまいち)

終了判定されるまで変換関数を繰り返し適用する次のような関数をAPIに追加して、250msかかったものが140msになったが、10倍以上のスピードアップを期待していたので満足できない結果となった。

// 単純なループ(終了判定されるまで変換関数を適用)
VARIANT __stdcall  repeat_imple( VARIANT*        init    ,  //初期値
                                                VARIANT*        pred  ,  //終了判定関数
                                                VARIANT*        trans  ,  //変換関数
                                                __int32           maxN ,  //回数上限
                                                __int32           scan   ,  //履歴 or 結果
                                                __int32           stopCondition);   //終了条件

API側に個別目的の関数を追加するのは抵抗があったので他の方法を検討していたが、いい方法が思いつかなかったのでこうした。少し残念である。

C++側でループすることでファンクタの生成コストはほとんどなくなったはずなのに性能が伸びないのは、合成した関数の呼び出し方法そのものが悪いのだろうか。