Elixir紧密循环加速

Gav*_*aff 5 erlang native elixir

我正在寻找加速我的灵药程序中"紧密循环"的方法.

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

它只是运行一个元组列表,并且每个元素都在执行:元组查找(c是整数),乘法和加法.

我试着插入模块的头部

@compile [:native, {:hipe, [:verbose, :o3]}]
Run Code Online (Sandbox Code Playgroud)

并在macOS上显示它编译本机.然而,当我从iex shell运行代码时,它比以前运行得更慢.我在这里错过了什么吗?

更新2015年5月3日 我现在已经意识到我的紧密循环运行速度几乎与Fortran等编译语言相当 - 而且速度要慢一些.我真正的瓶颈似乎是将该循环的输出发送到另一个进程 - 特别是当这种情况发生在网络上的节点之间时.

感谢所有表现出兴趣的人.

ror*_*rra 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
Run Code Online (Sandbox Code Playgroud)