Just the bare call to the C function including the calls to sys.frames and sys.calls takes as long as match.call. Here we've changed match_call() to return R_NilValue at the first function line:
fun <- function(x, y, z=TRUE) match_call() fun2 <- function(x, y, z=TRUE) match.call() library(microbenchmark) microbenchmark(fun(1, 2, 3), fun2(1, 2, 3))
Produces
Unit: microseconds expr min lq median uq max neval fun(1, 2, 3) 2.416 2.746 3.0710 3.474 137.333 100 fun2(1, 2, 3) 2.204 2.475 2.6925 2.969 11.608 100
With "normal" match_call (as of commit 71355fb), we get:
Unit: microseconds expr min lq median uq max neval fun(1, 2, 3) 4.521 5.2715 5.6135 6.0715 131.933 100 fun2(1, 2, 3) 2.315 2.6755 3.0280 3.3140 21.376 100
There is probably room for improvement, but given that we eval match.call from within match_call, it's hard to imagine it will get that much better. The actual match.call call inside match_call looks to take about 1.2us:
Exiting right before match.call:
Unit: microseconds expr min lq median uq max neval fun(1, 2, 3) 3.004 3.292 3.513 3.8445 171.104 2000
Exiting right after
Unit: microseconds expr min lq median uq max neval fun(1, 2, 3) 4.243 4.7125 4.994 5.412 41.397 2000
So maybe we can save half a microsecond someplace, or if really necessary code the match.call logic ourselves, though that will be a PITA.
sys.calls or to run from C via install/evallist(sys.calls(), sys.frames(), sys.parents())list sending each arg separately> microbenchmark(mc_test1(), mc_test2(), mc_test3(), times=1000)
Unit: microseconds
expr min lq median uq max neval
mc_test1() 1.501 1.6210 1.742 1.935 89.230 1000
mc_test2() 1.054 1.1470 1.212 1.369 99.947 1000
mc_test3() 1.378 1.4985 1.596 1.802 44.213 1000
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.