[Rcpp-devel] Why inline function is much faster than .Call?

Peng Yu pengyu.ut at gmail.com
Mon Aug 27 23:08:24 CEST 2012


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


More information about the Rcpp-devel mailing list