C++からRの関数を呼び出す. cygwin,gcc,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 loadedreal 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倍はやくなっていることがわかる.