2012-02-08 10 views
6

No soy un experto en optimización de compiladores. Ni siquiera estoy seguro de qué es "razonable" esperar en cuanto a compiladores u optimizaciones. Solo tengo curiosidad y hacer preguntas es todo.Optimizaciones del compilador de Erlang

En cualquier caso, estaba codificación algo de Erlang en una forma básica como este:

% TOY EXAMPLE 1 
test(X) -> 
    if 
     X-1 > 0 -> 
      yes; 
     X-1 == 0 -> 
      maybe; 
     true -> no 
    end. 

Luego entonces optimicé ella con el fin de no hacer la reste dos veces:

% TOY EXAMPLE 2 
test(X) -> 
    Z = X-1, 
    if 
     Z > 0 -> 
      yes; 
     Z == 0 -> 
      maybe; 
     true -> no 
    end. 

Entonces pensé "una pérdida de tiempo, seguramente el compilador optimiza el primer ejemplo en el segundo de todos modos". Así que decidí verificar ejecutando compilar: archivo con la opción 'S' para ambos. Aquí está la salida:

% 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. 

No son lo mismo. Si estoy leyendo esto bien (tal vez no), la optimización no se realiza.

puedo ver algunas posibilidades:

  1. La optimización puede llevarse a cabo, simplemente no estoy permitiendo a las optimizaciones porque estoy usando la función incorrecta para compilar, o no usar las banderas correctas, etc.

  2. La optimización simplemente no se realiza.

  3. Otro.

¿Qué es?

Nota: Por favor, no se empantanen con la conversación de "si usa una declaración de caso puede hacer tal o cual cosa" o "puede evitar esto haciendo bla-bla". El objetivo es simplemente probar qué optimizaciones hace o no el compilador de erlang, y por qué o por qué no.

Gracias.

Respuesta

4

Tiene toda la razón: el compilador Beam no hace ninguna eliminación común de subexpresiones. La razón probablemente sea que en el tipo de programas para los que se usa Erlang, esto no tendría ningún efecto notable, por lo que nadie se ha molestado en implementarlo. (Para los raros casos de código Erlang computacionalmente intensivo, generalmente es fácil para el programador encargarse de esto, como lo hizo en el segundo ejemplo).

Si compila con código nativo, puede obtener este tipo de optimización - el compilador de HiPE hace un mayor esfuerzo para generar un buen código de bajo nivel.

+0

"Eliminación común de subexpresiones" - lo conseguí. Sabía que había escuchado ese término en alguna parte antes. Creo que simplemente optimizaré la mayoría de las cosas y dejaré que Erlang optimice algunas cosas relacionadas con la recursión y otras cosas. –

Cuestiones relacionadas