[Rcpp-devel] Why inline function is much faster than .Call?
Jiqiang Guo
guojq28 at gmail.com
Mon Aug 27 23:20:41 CEST 2012
What is the optimization level for compiling your C++ code?
It matters.
Jiqiang
On Mon, Aug 27, 2012 at 5:08 PM, Peng Yu <pengyu.ut at gmail.com> wrote:
> On Mon, Aug 27, 2012 at 3:44 PM, Dirk Eddelbuettel <edd at debian.org> wrote:
> >
> > On 27 August 2012 at 15:17, Peng Yu wrote:
> > | Hi Dirk,
> > |
> > | > inlines uses .Call, so there is a slight logical problem here...
> And yes,
> > |
> > | What is the logical problem?
> >
> > What inline's cxxfunction() gives you is an object which uses .Call. So
> it
> > is a little hard to imagine how that could be faster than using .Call as
> it
>
> I agree with you that it is hard to imagine.
>
> > also uses .Call. More likely, it may reflect random fluctuations in your
> > setup as also suggested by Doug.
>
> Why don't you try it on your system and see what number you get? I
> have tried on two systems Mac and linux, if it were due to
> flucturation, one can not be consistently faster than the other.
>
> microbench run the function 100 times by default. it does not seem
> that Doug's comment makes sense.
>
> In the following, I try to run 1000 times with both microbenchmark as
> well as benchmark. "benchmark" shows that calling the wrapper function
> is a little slower, but "microbenchmark" still shows the opposite.
> Given our belief that the wrapper should be slower, I tend to think
> that there might be some bug in the way microbenchmark record the run
> time. But I'm not completely sure.
>
> Both evaluation methods still show inline is the fastest (this is true
> on linux, except the difference is only 2 times not almost 10 times).
>
>
> # on mac
> > library(microbenchmark)
> > microbenchmark(test(xx), test_inline(xx), .Call('test', xx), times=1000)
> Unit: microseconds
> expr min lq median uq max
> 1 .Call("test", xx) 94.515 95.6160 96.3790 97.7700 135.709
> 2 test_inline(xx) 4.451 5.1655 6.4150 6.6380 29.944
> 3 test(xx) 69.004 69.8880 70.5375 71.4975 199.150
> > library(rbenchmark)
> > benchmark(test(xx), test_inline(xx), .Call('test', xx),
> replications=1000)
> test replications elapsed relative user.self sys.self
> user.child sys.child
> 3 .Call("test", xx) 1000 0.076 8.444444 0.044 0.032
> 0 0
> 2 test_inline(xx) 1000 0.009 1.000000 0.009 0.000
> 0 0
> 1 test(xx) 1000 0.078 8.666667 0.046 0.032
> 0 0
>
>
> --
> Regards,
> Peng
> _______________________________________________
> Rcpp-devel mailing list
> Rcpp-devel at lists.r-forge.r-project.org
> https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20120827/16d594f2/attachment-0001.html>
More information about the Rcpp-devel
mailing list