2012-02-08 26 views
6

コンパイラ最適化の専門家はいません。私は、コンパイラや最適化に期待するのが「合理的」なのかどうかも分かりません。私はちょうど興味があり、質問することはすべてです。いずれにしても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. 

これらは同じではありません。私がこの権利を読んでいるなら(私はそうではないかもしれないが)、最適化は実行されない。

私はいくつかの可能性を確認できます。

  1. 最適化を行うことができ、私はちょうど私がコンパイルに間違った機能を使用していますので、最適化を有効にしない、または正しいフラグを使用していないが、

  2. 最適化はただ実行されません。

  3. その他。

どちらですか?

注:「そうしたことができるケースステートメントを使用する場合」または「これを避けて行うことができます」という話ではうんざりしないでください。重要な点は、erlangコンパイラがどのような最適化を行うかどうか、そしてなぜ、なぜそうしないのかをテストすることです。

ありがとうございました。

答えて

4

Beamコンパイラは共通部分式の削除を一切しません。その理由は、Erlangが典型的に使用されている種類のプログラムでは、これが顕著な効果を持たないため、誰もそれを実装するのを邪魔していない可能性があります。 (計算の多いErlangコードのまれなケースでは、2番目の例のように、プログラマが簡単に処理できます)

ネイティブコードにコンパイルすると、このような最適化が行われる可能性があります - HiPEコンパイラは、優れた低レベルコードを生成するために大きな努力を払っています。

+0

"共通部分式消去" - それを得ました。私は前にどこかでその言葉を聞いたことが分かっていました。私は、ほとんどのものを手作業で最適化し、erlangに再帰を扱ういくつかのものを最適化させ、そうでないものを最適化させるでしょう。 –

関連する問題