Я не эксперт по оптимизации компилятора. Я даже не уверен, что «разумно» ожидать от компиляторов или оптимизаций. Мне просто любопытно, и все вопросы задаю.
Во всяком случае, я кодировал некоторый Эрланг в такой базовой форме, как эта:
% 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: файл с опцией '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.
Они не одинаковы. Если я правильно читаю (возможно, нет), оптимизация не выполняется.
Я вижу несколько возможностей:
Оптимизация может быть выполнена, я просто не включаю оптимизацию, потому что я использую неправильную функцию для компиляции, или не использую правильные флаги и т. Д.
Оптимизация просто не выполняется.
прочее.
Что это?
Примечание: Пожалуйста, не увязайте в разговорах о том, что «если вы используете заявление о кейсе, вы можете делать то-то и то-то» или «вы можете избежать этого, делая бла-бла». Суть в том, чтобы просто проверить, какие оптимизации выполняет или не выполняет компилятор erlang, и почему или почему нет.
Спасибо.