Я делал некоторую оптимизацию, удаляя один шаг из процесса...
> library(microbenchmark)
> microbenchmark(paste0("this","and","that"))
Unit: microseconds
expr min lq mean median uq max neval
paste0("this", "and", "that") 2.026 2.027 3.50933 2.431 2.837 34.038 100
> microbenchmark(.Internal(paste0(list("this","and","that"),NULL)))
Unit: microseconds
expr min lq mean median uq max neval
.Internal(paste0(list("this", "and", "that"), NULL)) 1.216 1.621 2.77596 2.026 2.027 43.764 100
пока что так хорошо...
но после того, как я заметил, что list
определяется как
function (...) .Primitive("list")
Я попытался далее "упростить"
> microbenchmark(.Internal(paste0(.Primitive("list")("this","and","that"),NULL)))
Unit: microseconds
expr min lq mean median uq max neval
.Internal(paste0(.Primitive("list")("this", "and", "that"), NULL)) 3.241 3.242 4.66433 3.647 3.648 80.638 100
и время увеличивается!
Я предполагаю, что обработка строки "list"
является источником проблемы и что она обрабатывается по-разному в пределах фактического вызова функции list
но как?
отказ от ответственности: я знаю, что это больно читаемости больше, чем помогает производительности. Это просто для некоторых очень простых функций, которые не будут меняться и использоваться так часто, что небольшие проблемы с производительностью также требуются даже при такой стоимости.
Изменить в ответ на комментарий Джоша О'Брайена:
Я не уверен, что это говорит о его идее, но
library(compiler)
ff <- compile(function(...){.Internal(paste0(.Primitive("list")("this","and","that"),NULL))})
ff2 <- compile(function(...){.Internal(paste0(list("this","and","that"),NULL))})
microbenchmark(eval(ff),eval(ff2),times=10000)
> microbenchmark(eval(ff2),eval(ff),times=10000)
Unit: microseconds
expr min lq mean median uq max neval
eval(ff2) 1.621 2.026 2.356761 2.026 2.431 144.257 10000
eval(ff) 1.621 2.026 2.455913 2.026 2.431 89.148 10000
и глядя на график, созданный с помощью microbenchmark (просто оберните его plot()
, чтобы увидеть его сами), запуская его несколько раз, похоже, что они имеют статистически идентичную производительность, несмотря на то, что значение "max", похожее на ff2, хуже худшего. Не знаю, что с этим делать, но, возможно, это поможет кому-то. Итак, все это в основном говорит о том, что они скомпилируются в идентичный код. Означает ли это, что его комментарий является ответом?