我并不是编译优化专家,甚至不确定针对编译器或优化方面有什么“合理”的期望。我只是好奇,并且只是在提问。
无论如何,我正在编写一些基本的 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.
然后我想:“浪费时间 - 编译器肯定会将第一个示例优化为第二个示例。” 所以我决定通过对两者都使用'S'选项运行compile:file来进行检查。以下是输出:
% 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.
它们不是一样的。如果我理解正确的话(也许不是),就没有执行优化。
我能看到几种可能性:
1. 可以执行优化,只是我没有启用优化,因为我正在使用错误的编译函数或者没有使用正确的标志等。 2. 优化只是没有执行。 3. 其他。
到底是哪种情况呢?
注意:请不要陷入“如果你使用一个case语句,你可以做某某某”的谈话或“通过做某些操作,你可以避免这个问题”的细节中。重点是测试erlang编译器是否执行或不执行哪些优化,以及原因。
谢谢。