Benchmarking: usando `expression`` quote` ou nenhum dos dois
Geralmente, quando eu executo benchmarks, eu envolvo minhas declaraçõesexpression
. Recentemente, foi sugerido para (a) não fazê-lo ou (b) usarquote
em vez de expressão.
Eu acho duas vantagens para envolver as declarações:
em comparação com declarações inteiras, elas são mais facilmente trocadas.Eu posso lapidar uma lista de entradas e comparar esses resultadosNo entanto, ao explorar os diferentes métodos, notei uma discrepância entre os três métodos (envolvendoexpression
embrulhandoquote
, ou não embrulhando de jeito nenhum)
A questão é:
Por que a discrepância?
(parece que embrulhandoquote
não avalia realmente a chamada.)
# SAMPLE DATA
mat <- matrix(sample(seq(1e6), 4^2*1e4, T), ncol=400)
# RAW EXPRESSION TO BENCHMARK IS:
# apply(mat, 2, mean)
# WRAPPED EXPRESSION:
expr <- expression(apply(mat, 2, mean))
quot <- quote(apply(mat, 2, mean))
# BENCHMARKS
benchmark(raw=apply(mat, 2, mean), expr, quot)[, -(7:8)]
# test replications elapsed relative user.self sys.self
# 2 expr 100 1.269 NA 1.256 0.019
# 3 quot 100 0.000 NA 0.001 0.000
# 1 raw 100 1.494 NA 1.286 0.021
# BENCHMARKED INDIVIDUALLY
benchmark(raw=apply(mat, 2, mean))[, -(7:8)]
benchmark(expr)[, -(7:8)]
benchmark(quot)[, -(7:8)]
# results
# test replications elapsed relative user.self sys.self
# 1 raw 100 1.274 1 1.26 0.018
# test replications elapsed relative user.self sys.self
# 1 expr 100 1.476 1 1.342 0.021
# test replications elapsed relative user.self sys.self
# 1 quot 100 0.006 1 0.006 0.001