#r #compiler-optimization
Вопрос:
Исходя из некоторого кода, который я получил в Интернете, я задался вопросом, есть ли какая-то опция для настройки, чтобы оптимизировать компилятор байт-кода. В документации compiler::cmpfun
говорится, что существует уровень оптимизации, который можно установить с помощью параметра «опция» (но как?), и который уже имеет значение 2 в диапазоне от 0 до 3, что кажется довольно высоким.
Но в моем примере оптимизация кажется очень плохой. Дисплей ниже-это просто некоторая постобработка вокруг вывода compiler::disassemble
функции, чтобы сделать вещи более красивыми. Как говорится в разборке, он пытается сделать z lt;- z
то, что не имеет особого смысла. Это могло бы иметь смысл, если z
бы была активная привязка, но это, очевидно, не так.
f lt;- function (x) {z lt;- 0; z lt;- if (x==42) 0 else z; x} f lt;- compiler::cmpfun(f) purrr::walk(dasm(f),function(x) message(paste(x,collapse=' '))) ## LDCONST.OP 1 # the constant 0 ## SETVAR.OP 3 # z bound to it (3 must be some kind of location for z) ## POP.OP # ignore result of lt;- ## GETVAR.OP 5 # the value of x ## LDCONST.OP 7 # the constant 42 ## EQ.OP 8 # test for equality ## BRIFNOT.OP 9 19 # if not eq, goto step (2) ## LDCONST.OP 10 # else (eq), the constant 0 ## GOTO.OP 21 # and goto step (3) ## GETVAR.OP 3 # step 2(eq): get the value of z ## SETVAR.OP 3 # and set z to be a reference ## POP.OP # and ignore the result of lt;- ## GETVAR.OP 5 # step 3: get the value of x ## RETURN.OP # and return it as the result of f
Я видел другие связанные с этим вопросы на SO, но без какого-либо начала ответа на мой, вероятно, потому, что эти ответы немного устарели, из эпохи, когда компиляция была не такой частой…
Комментарии:
1.
?cmpfun
предлагает сделатьcmpfun(f, options = list(optimize = lt;valgt;))
это, когда вы хотите установить уровень оптимизации.