Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: GavinBrelstaffОтветов: 1

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

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, а не на несколько порядков медленнее. Моим реальным узким местом, похоже, является отправка вывода этого цикла другому процессу, особенно когда это происходит между узлами в сети.

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

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

nativeelixirerlang

Ответы

Ответ 1 · рейтинг 1 · rorra

Вы пробовали использовать сопоставление с образцом? Обычно это быстрее, чем использовать 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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы