2015-04-17 9 views
5

Ich bin auf der Suche nach Möglichkeiten, die "tight-Schleife" in meinem Elixier-Programm zu beschleunigen.Elixier Tight-Loop beschleunigen

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

Es läuft einfach durch eine Liste von Tupeln und für jeden es tut: ein Tupel-Lookup (c ist eine ganze Zahl), eine Multiplikation und eine Zugabe.

Ich habe versucht, in den Modulkopf Einfügen

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

und auf macOS es zeigt es die Erstellung nativer. Aber wenn ich gehe und den Code von der iex-Shell ausführen, läuft es noch langsamer als zuvor. Fehle ich hier etwas?

UPDATE 3. Mai 2015 Ich habe nun zu der Erkenntnis gelangt, dass meine enge Schleife mit Geschwindigkeiten wie Fortran fast gleichwertig kompilierten Sprachen ausgeführt wird - auch nicht um Größenordnungen langsamer. Mein wirklicher Engpass scheint das Senden der Ausgabe dieser Schleife an einen anderen Prozess zu sein - besonders, wenn dies zwischen Knoten in einem Netzwerk geschieht.

Vielen Dank an alle, die Interesse gezeigt haben.

+0

okay, kann die Antwort sein ist eine Erlang Mutter für dieses Stück Code implementierte Funktion zu verwenden - gcc es zu kompilieren. Mal sehen ... – GavinBrelstaff

Antwort

1

Haben Sie versucht mit Musterabgleich? Normalerweise ist die schneller als Enum.reduce mit denen unter der Haube Listen verwendet: 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

Danke rorra, aber keine nennenswerte Beschleunigung mit Ihrem Modul. Ich denke Enum.reduce macht bereits eine gute Optimierung für Erlang. – GavinBrelstaff