Помогает ли установка наиболее подходящих функциональных головок в первую очередь? - PullRequest
0 голосов
/ 21 октября 2018

Скажем, у нас есть несколько function heads или case do шаблонов для сопоставления.

Будет ли сначала размещаться "общий случай" или "наиболее вероятный" заголовокпредлагаете какие-либо преимущества?

Я вижу улучшения во времени, когда я переупорядочиваю case do шаблоны соответствия в ELIXIR, ставя наиболее распространенный шаблон на первое место.

Я ожидал, что виртуальная машина оптимизирует этопрочь, и порядок не должен иметь значения.

Пример:

  for {s, i} <- li do
    case :binary.split(s, spliter, [:global]) do
      [_, tag, val, _, _] -> 
        # this pattern occurs over 9/10 times.
        # in files with over 100000 rows matching this pattern
        # reduced processing time
        {:tv, i, tag, val}

      [_, "data", _] ->
        Process.put(:data_tag, true)
        {:tb, i, "data"}

      [_, "/data", _] ->
        Process.put(:data_tag, false)
        {:te, i, "data"}

      [_, "/" <> tag, _] ->
        if Process.get(:data_tag) do
          {nil, i}
        else
          {:te, i, tag}
        end

      [_, "?xml" <> _, _] ->
        {nil, i}

      [_, "!--" <> _, _] ->
        {nil, i}

      [_, "return" <> _, _] ->
        {nil, i}

      [_, tag, _] ->
        if Process.get(:data_tag) do
          {:tv, i, tag, ""}
        else
          {:tb, i, tag}
        end

      _ ->
        {nil, i}
    end
  end

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Вы ожидаете слишком многого от компилятора Erlang:)

Хотя приведенный здесь ответ, безусловно, является правильным, и компилятор Erlang может изменить порядок предложений, он не может предсказать , какие двоичные файлы будут встречаться чащев вашем вводе .

Тем не менее, можно ожидать оптимизации предложений, имеющих разную защиту и / или взаимоисключающих, но компилятор не может знать, что вы получаете "?xml" чаще, чем "data".

0 голосов
/ 21 октября 2018

Не должно быть никакой пользы, кроме читабельности.Elixir по-прежнему компилируется в деревья абстрактного синтаксиса Erlang, а компилятор Erlang позволяет переупорядочивать предложения настолько эффективно, насколько это возможно.

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

Тем не менее, как вы обнаружили, может быть более широкое ветвлениеслучаи, когда компилятор не видит действительно очевидного способа улучшить время выполнения (например, проверка нескольких литералов одного и того же точного типа), и вы можете увидеть преимущества.

...