2016-11-26 14 views
5

マイナーな場合でも、以下のように関数呼び出しを連鎖させることでパフォーマンスを得ることができますか?コールチェーンのパフォーマンスが向上しますか?

execute() -> 
    step4(step3(step2(step1())). 

代わりの

execute() -> 
    S1 = step1(), 
    S2 = step2(S1), 
    S3 = step3(S2), 
    step4(S3). 

私は、ガベージコレクタがS1S2S3のために行うにはいくつかの仕事を持っている第二版でいるかどうかを考えていました。それは最初のバージョンにも適用する必要がありますか?

答えて

5

彼らは、コンパイル後に同じです。あなたは、同じコード(唯一異なるの行番号とラベル番号の両方のexecute1execute2結果を見ることができるように

$ cat a.erl 
-module(a). 
-compile(export_all). 

step1() -> ok. 
step2(_) -> ok. 
step3(_) -> ok. 
step4(_) -> ok. 

execute1() -> 
    step4(step3(step2(step1()))). 

execute2() -> 
    S1 = step1(), 
    S2 = step2(S1), 
    S3 = step3(S2), 
    step4(S3). 
$ erlc -S a.erl 
$ cat a.S 
{module, a}. %% version = 0 

... 

{function, execute1, 0, 10}. 
    {label,9}. 
    {line,[{location,"a.erl",9}]}. 
    {func_info,{atom,a},{atom,execute1},0}. 
    {label,10}. 
    {allocate,0,0}. 
    {line,[{location,"a.erl",10}]}. 
    {call,0,{f,2}}. 
    {line,[{location,"a.erl",10}]}. 
    {call,1,{f,4}}. 
    {line,[{location,"a.erl",10}]}. 
    {call,1,{f,6}}. 
    {call_last,1,{f,8},0}. 


{function, execute2, 0, 12}. 
    {label,11}. 
    {line,[{location,"a.erl",12}]}. 
    {func_info,{atom,a},{atom,execute2},0}. 
    {label,12}. 
    {allocate,0,0}. 
    {line,[{location,"a.erl",13}]}. 
    {call,0,{f,2}}. 
    {line,[{location,"a.erl",14}]}. 
    {call,1,{f,4}}. 
    {line,[{location,"a.erl",15}]}. 
    {call,1,{f,6}}. 
    {call_last,1,{f,8},0}. 

... 

:あなたはerlc -Sを通じてERLファイルを実行し、生成された.Sファイルを読み込むことでこれを確認することができます。私は、ドキュメントのアセンブラコード生成に相関して `-S`オプションのいずれかの参照を見つけるcould't

+0

。' .S'ファイルはアセンブラコードが含まれている記載されているが、それはそれらを生成する方法を教えてくれません。 http://erlang.org/doc/man/erlc.html – ipinak

関連する問題