For reference, your benchmark using UNWIND_PROTECT:> system.time(test(testFunc, evn$x))user system elapsed 0.331 0.000 0.331> system.time(test(C_test1, testFunc, evn$x))user system elapsed 2.029 0.000 2.036> system.time(test(C_test2, expr, evn))user system elapsed 2.307 0.000 2.313> system.time(test(C_test3, testFunc, evn$x))user system elapsed 2.131 0.000 2.138 I?aki On Tue, 18 Jun 2019 at 20:35, I?aki Ucar <iucar at fedoraproject.org> wrote:> > On Tue, 18 Jun 2019 at 19:41, King Jiefei <szwjf08 at gmail.com> wrote: > > > > [...] > > > > It is clear to see that calling an R function in R is the fast one, it is > > about 5X faster than ` R_forceAndCall ` and ` Rf_eval`. the latter two > > functions have a similar performance and using Rcpp is the worst one. Is it > > expected? Why is calling an R function from C++ much slower than calling > > the function from R? Is there any faster way to do the function call in C++? > > Yes, there is: enable fast evaluation by setting > -DRCPP_USE_UNWIND_PROTECT, or alternatively, use > > // [[Rcpp::plugins(unwindProtect)]] > > I?aki-- I?aki ?car
Hello Kevin and I?aki, Thanks for your quick responses. I sincerely appreciate them! I can see how complicated it is to interact with R in C. I?aki's suggestion is very helpful, I saw there is a lot of performance gain by turning the flag on, but sadly the best performance it can offer still cannot beat R itself. It is interesting to see that C++ is worse than R in this special case despite there is a common belief that C++ code is the fast one... Anyway, thanks again for your suggestions and reference! Best, Jiefei On Tue, Jun 18, 2019 at 2:39 PM I?aki Ucar <iucar at fedoraproject.org> wrote:> For reference, your benchmark using UNWIND_PROTECT: > > > system.time(test(testFunc, evn$x)) > user system elapsed > 0.331 0.000 0.331 > > system.time(test(C_test1, testFunc, evn$x)) > user system elapsed > 2.029 0.000 2.036 > > system.time(test(C_test2, expr, evn)) > user system elapsed > 2.307 0.000 2.313 > > system.time(test(C_test3, testFunc, evn$x)) > user system elapsed > 2.131 0.000 2.138 > > I?aki > > On Tue, 18 Jun 2019 at 20:35, I?aki Ucar <iucar at fedoraproject.org> wrote: > > > > On Tue, 18 Jun 2019 at 19:41, King Jiefei <szwjf08 at gmail.com> wrote: > > > > > > [...] > > > > > > It is clear to see that calling an R function in R is the fast one, it > is > > > about 5X faster than ` R_forceAndCall ` and ` Rf_eval`. the latter two > > > functions have a similar performance and using Rcpp is the worst one. > Is it > > > expected? Why is calling an R function from C++ much slower than > calling > > > the function from R? Is there any faster way to do the function call > in C++? > > > > Yes, there is: enable fast evaluation by setting > > -DRCPP_USE_UNWIND_PROTECT, or alternatively, use > > > > // [[Rcpp::plugins(unwindProtect)]] > > > > I?aki > > > > -- > I?aki ?car >[[alternative HTML version deleted]]
On Wed, 19 Jun 2019 at 07:42, King Jiefei <szwjf08 at gmail.com> wrote:> > Hello Kevin and I?aki, > > Thanks for your quick responses. I sincerely appreciate them! I can see how complicated it is to interact with R in C. I?aki's suggestion is very helpful, I saw there is a lot of performance gain by turning the flag on, but sadly the best performance it can offer still cannot beat R itself. It is interesting to see that C++ is worse than R in this special case despite there is a common belief that C++ code is the fast one... Anyway, thanks again for your suggestions and reference!That is misleading. C++ code is faster, that's beyond doubt. But you are not running C++ code here, you are running R code. So what is faster, running R code or executing something that then runs R code? Obviously the first thing is the baseline, and from there, it can only get worse as you add more layers on top of it. I?aki