2015-04-17 4 views
5

Я ищу способы ускорить «тупик» в моей программе эликсиров.Эликсир с плотной петлей ускоряется

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

Это просто пробегая список кортежей и для каждого это делает: кортеж поиск (с представляет собой целое число), умножение и дополнение.

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

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

и MacOS это показывает, что он компиляцию родным. Но когда я иду и запускаю код из оболочки iex , он работает еще медленнее, чем раньше. Я что-то упустил?

UPDATE 3 мая 2015 Теперь я пришел к выводу, что мой плотный контур работает со скоростью почти эквивалентными языками как Fortran - ну не порядков медленнее. Мое настоящее узкое место, похоже, является отправкой вывода этого цикла в другой процесс, особенно когда это происходит между узлами в сети.

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

+0

порядке может быть ответ заключается в использовании Erlang Native Реализована функция для этого бита кода - с помощью GCC для компиляции. Давайте посмотрим ... – GavinBrelstaff

ответ

1

Вы пробовали с шаблоном? Обычно его быстрее, чем при использовании Enum.reduce, который под капотом использует списки: 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 
+0

Спасибо rorra, но не получайте заметной скорости, используя ваш модуль. Думаю, Enum.reduce уже делает хорошую оптимизацию для Erlang. – GavinBrelstaff