Я делал некоторую оптимизацию, удаляя один шаг из процесса...
> 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, хуже худшего. Не знаю, что с этим делать, но, возможно, это поможет кому-то. Итак, все это в основном говорит о том, что они скомпилируются в идентичный код. Означает ли это, что его комментарий является ответом?