Erlang оптимизация компилятора - PullRequest
7 голосов
/ 08 февраля 2012

Я не эксперт по оптимизации компилятора. Я даже не уверен, что «разумно» ожидать от компиляторов или оптимизаций. Мне просто любопытно, и все вопросы задаю.

Во всяком случае, я кодировал некоторый Эрланг в такой базовой форме, как эта:

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

Затем я оптимизировал его, чтобы не делать вычитание дважды:

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

Тогда я подумал: «трата времени - наверняка компилятор оптимизирует первый пример во второй». Поэтому я решил проверить, запустив compile: файл с опцией '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, и почему или почему нет.

Спасибо.

1 Ответ

5 голосов
/ 09 февраля 2012

Вы совершенно правы - компилятор Beam не выполняет никакого обычного исключения подвыражения.Причина, вероятно, в том, что в тех программах, для которых обычно используется Erlang, это не будет иметь заметного эффекта, поэтому никто не удосужился реализовать его.(В редких случаях интенсивного вычислительного кода Erlang программисту обычно легко позаботиться об этом, как вы это делали во втором примере.)

Если вы компилируете в нативный код, вы можете получить этот видоптимизации - компилятор HiPE прилагает больше усилий для генерации хорошего низкоуровневого кода.

...