Non sono esperto di ottimizzazione del compilatore. Non sono nemmeno sicuro di cosa sia "ragionevole" aspettarsi per quanto riguarda i compilatori o le ottimizzazioni. Sono solo curioso e faccio domande è tutto.Otlang ottimizzazioni del compilatore
In ogni caso, mi è stato codificare fino qualche Erlang in una forma di base di questo tipo:
% TOY EXAMPLE 1
test(X) ->
if
X-1 > 0 ->
yes;
X-1 == 0 ->
maybe;
true -> no
end.
Poi ho poi ottimizzato al fine di non fare lo sottrarre due volte:
% TOY EXAMPLE 2
test(X) ->
Z = X-1,
if
Z > 0 ->
yes;
Z == 0 ->
maybe;
true -> no
end.
Poi ho pensato "una perdita di tempo - sicuramente il compilatore ottimizza comunque il primo esempio nel secondo". Così ho deciso di verificare eseguendo compilazione: file con l'opzione "S" per entrambi. Ecco l'output:
% 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.
Non sono la stessa cosa. Se sto leggendo questo diritto (forse non lo sono), l'ottimizzazione non viene eseguita.
posso vedere un paio di possibilità:
L'ottimizzazione può essere eseguita, sto solo non consentendo le ottimizzazioni perché sto utilizzando la funzione sbagliato a compilare, o non utilizzo i flag corretti, ecc.
L'ottimizzazione non viene eseguita.
Altro.
Quale è?
Nota: Si prega di non impantanarsi quando si parla di "se si utilizza una dichiarazione di un caso si può fare tale e così" o "si può evitare facendo blah-blah". Il punto è semplicemente quello di testare quali ottimizzazioni il compilatore di erlang fa o non fa, e perché o perché no.
Grazie.
"Eliminazione di sottoespressione comune" - capito. Sapevo di aver sentito quel termine da qualche parte prima. Immagino che mi limiterò a ottimizzare la maggior parte delle cose e far sì che erlang ottimizzi alcune cose che riguardano la ricorsione e quali no. –