Я не эксперт по оптимизации компиляторов. Я даже не уверен, чего «разумного» ожидать в отношении компиляторов или оптимизаций. Мне просто любопытно, и я задаю вопросы.
Во всяком случае, я кодировал некоторый Erlang в базовой форме, такой как:
% TOY EXAMPLE 1
test(X) ->
if
X-1 > 0 ->
yes;
X-1 == 0 ->
maybe;
true -> no
end.
Затем я оптимизировал его, чтобы не выполнять вычитание дважды:
% TOY EXAMPLE 2
test(X) ->
Z = X-1,
if
Z > 0 ->
yes;
Z == 0 ->
maybe;
true -> no
end.
Тогда я подумал, что «пустая трата времени - конечно, компилятор все равно оптимизирует первый пример во второй ". Поэтому я решил проверить, запустив compile: file с опцией «S» для обоих. Вот вывод:
% TOY EXAMPLE 1
{function, test, 1, 15}.
{label,14}.
{func_info,{atom,exchange},{atom,test},1}.
{label,15}.
{gc_bif,'-',{f,16},1,[{x,0},{integer,1}],{x,1}}.
{test,is_lt,{f,16},[{integer,0},{x,1}]}.
{move,{atom,yes},{x,0}}.
return.
{label,16}.
{gc_bif,'-',{f,17},1,[{x,0},{integer,1}],{x,1}}.
{test,is_eq,{f,17},[{x,1},{integer,0}]}.
{move,{atom,maybe},{x,0}}.
return.
{label,17}.
{move,{atom,no},{x,0}}.
return.
% TOY EXAMPLE 2
{function, test, 1, 15}.
{label,14}.
{func_info,{atom,exchange},{atom,test},1}.
{label,15}.
{gc_bif,'-',{f,0},1,[{x,0},{integer,1}],{x,0}}.
{test,is_lt,{f,16},[{integer,0},{x,0}]}.
{move,{atom,yes},{x,0}}.
return.
{label,16}.
{test,is_eq,{f,17},[{x,0},{integer,0}]}.
{move,{atom,maybe},{x,0}}.
return.
{label,17}.
{move,{atom,no},{x,0}}.
return.
Они не совпадают. Если я правильно это прочитал (а может, и нет), оптимизация не выполняется.
Я вижу несколько возможностей:
Оптимизация может быть выполнена, я просто не включаю оптимизацию, потому что я использую неправильную функцию для компиляции или не использую правильные флаги и т. Д.
Оптимизация просто не производится.
Другое.
Что это такое?
Примечание: пожалуйста, не увязайте в разговорах о том, «если вы используете оператор case, вы можете сделать то-то и то-то» или «вы можете избежать этого, выполнив бла-бла». " Дело в том, чтобы просто проверить, какие оптимизации делает компилятор erlang, а какие нет, и почему или почему нет.
Спасибо.