Эликсир ускорение цикла

Я ищу способы ускорить "жесткий цикл" в моей программе эликсира.

Enum.reduce( list, 0, fn ({c,v},acc) -> v*elem(tuple_array,c) + acc end )

Он просто просматривает список кортежей и для каждого выполняет: поиск кортежа (c — целое число), умножение и сложение.

Я попытался вставить в голову модуля

@compile [:native, {:hipe, [:verbose, :o3]}]

а в macOS он показывает, что компилируется нативно. Тем не менее, когда я иду и запускаю код из оболочки iex, он работает даже медленнее, чем раньше. Я что-то упустил здесь?

ОБНОВЛЕНИЕ 3 мая 2015 г. Теперь я понял, что моя замкнутая петля работает со скоростью, почти эквивалентной скорости компилируемых языков, таких как Fortran, а не на несколько порядков медленнее. Моим реальным узким местом, похоже, является отправка вывода этого цикла другому процессу, особенно когда это происходит между узлами в сети.

Спасибо всем, кто проявил интерес.


person GavinBrelstaff    schedule 17.04.2015    source источник
comment
хорошо, может быть, ответ заключается в использовании встроенной реализованной функции Erlang для этого фрагмента кода - с использованием gcc для его компиляции. Посмотрим ...   -  person GavinBrelstaff    schedule 20.04.2015


Ответы (1)


Вы пробовали использовать сопоставление с образцом? Обычно это быстрее, чем использовать Enum.reduce, который использует lists:foldr.

defmodule Test do
  def reduce_list([], acc, f) do
    acc
  end

  def reduce_list([h|t], acc, f) do
    reduce_list(t, f.(h, acc), f)
  end
end
person rorra    schedule 21.04.2015
comment
Спасибо, rorra, но с помощью вашего модуля вы не получите заметного ускорения. Я предполагаю, что Enum.reduce уже делает хорошую оптимизацию для Erlang. - person GavinBrelstaff; 21.04.2015