コンパイラ最適化の専門家はいません。私は、コンパイラや最適化に期待するのが「合理的」なのかどうかも分かりません。私はちょうど興味があり、質問することはすべてです。いずれにしてもErlangコンパイラの最適化
、私はこのような基本的な形でいくつかのアーランをコーディングした
% TOY EXAMPLE 1
test(X) ->
if
X-1 > 0 ->
yes;
X-1 == 0 ->
maybe;
true -> no
end.
は、その後、私は2回減算をしないためにそれを最適化:
% TOY EXAMPLE 2
test(X) ->
Z = X-1,
if
Z > 0 ->
yes;
Z == 0 ->
maybe;
true -> no
end.
そして、私は「時間の無駄だと思っていました。確かにコンパイラは最初の例を2番目に最適化します」だから、私は両方のコンパイルファイルを '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コンパイラがどのような最適化を行うかどうか、そしてなぜ、なぜそうしないのかをテストすることです。
ありがとうございました。
"共通部分式消去" - それを得ました。私は前にどこかでその言葉を聞いたことが分かっていました。私は、ほとんどのものを手作業で最適化し、erlangに再帰を扱ういくつかのものを最適化させ、そうでないものを最適化させるでしょう。 –