C++からRの関数を呼び出す. cygwin,gcc,g++版

C++からRの関数を呼び出す. cygwingcc,g++版:
時間計測:
これ
http://d.hatena.ne.jp/teramonagi/20101213/1292253192
を参考にtest.cpp

#include <windows.h>
#include <iostream>
//doubleの引数一個取ってdoubleの値返す関数ポインタをRFuncと定義
typedef double(*RFunc)(double x);
int main(void)
{
        //R.dllを召喚。exeのファイルと同じ箇所に入れているとしてる
        HINSTANCE handle_Dll = LoadLibrary(TEXT("libR.dll"));
        if( ! handle_Dll ){
                std::cout << "DLL load error";
                return 1;
        }
        std::cout << "DLL loaded \n";
        //ガンマ関数の関数ポインタをdllから召喚
        RFunc gamma = (RFunc)GetProcAddress(handle_Dll, "Rf_gammafn");
        //Γ(0.5)の値を表示(もちろんRで出す値と一致!)
        for(int k=1;k<=100000000;k++){
        //      std::cout << "Γ(0.5):" << gamma(0.5);
                gamma(0.5);
        }
        //DLLを解放
        FreeLibrary(handle_Dll);
        return 0;
}

を作成.

/binの中にあるlibR.dllをプログラムのあるところにコピー

gcc test.cpp -O3

時間計測

$ time ./a.exe
DLL loaded

real 0m10.085s
user 0m9.999s
sys 0m0.015s

Rで同じことをやると

> t<-proc.time()
> for(i in 1:100000000){
+ gamma(0.5)
+ }
> proc.time()-t
   ユーザ   システム       経過  
     44.85       0.11      45.51 

約5倍はやくなっていることがわかる.