2016-10-31 7 views
4

Das hört sich vielleicht so an, als würde ich einen Flammenkrieg beginnen, aber hör mir zu.Sollte ich Enum in Elixir bevorzugen?

In einigen Sprachen ist Faulheit teuer. Zum Beispiel in Ruby, wo ich die jüngsten Erfahrungen haben, ist Faulheit langsam, weil es Fasern erreicht ist verwenden, so ist es nur dann attraktiv, wenn:

  • Sie cpu für Speicher abwägen muss (man denke durch große Datenmenge Paging)
  • die Leistungseinbuße ist es wert Details zu verstecken (zu Faser nachgiebig ist eine gute Möglichkeit, die Komplexität zu abstrahieren, anstatt nach unten Blöcken vorbei in geheimnisvollen Orten zu laufen)

Ansonsten werden Sie auf jeden Fall die verwendet werden sollen normale, eifrige Methoden.

Meine erste Untersuchung legt nahe, dass der Overhead für Faulheit in Elixir viel niedriger ist (this thread auf reddit unterstützt mich), so scheint es keinen Grund zu geben Enum anstelle von Stream für die Dinge, die Stream tun können.

Gibt es etwas, das ich vermisse, da ich annehme, Enum existiert aus einem Grund und implementiert einige der gleichen Funktionen wie Stream. In welchen Fällen würde ich Enum anstelle von Stream verwenden wollen, wenn ich Stream verwenden könnte?

Antwort

8

Für kurze Listen ist Stream langsamer als Enum, aber es gibt keine klare Regel, ohne genau zu vergleichen, was Sie tun. Es gibt auch einige Funktionen in Enum, aber keine entsprechenden Funktionen in Stream. (z. B. Enum.reverse)

Der wahre Grund, warum Sie beide benötigen, ist, dass Stream nur eine Zusammensetzung von Funktionen ist. Jede Pipeline, die Ergebnisse und keine Nebenwirkungen benötigt, muss in einem Enum enden, damit die Pipeline ausgeführt wird.

Sie gehen Hand in Hand, Stream konnte nicht alleine stehen. Was Stream hauptsächlich tut, ist eine sehr praktische Abstraktion für die Erstellung sehr komplexer reduzierter Funktionen.

+0

Ich denke, Sie meinen "sehr komplexe Kartenfunktionen" – greggreg

+1

Nein, ich meine reduzieren. Karte ist ein Spezialfall von reduzieren. Siehe https://github.com/elixir-lang/elixir/blob/master/lib/elixir/lib/stream/reducers.ex –

+0

ah ja, guten Ruf! – greggreg

6

Die Methoden in Stream erstellen im Wesentlichen eine "Rezeptliste" von Transformationen über Ihre Daten, während die Methoden in Enum diese Transformationen tatsächlich auflösen. Daher müssen Sie eventuell eine Enum-Funktion verwenden, um Ihre Datenumwandlung aufzulösen, selbst wenn alles andere ein Stream ist.

Auch einige Konzepte, nämlich Reduce, haben keine wirkliche Bedeutung in Stream und Sie müssen Enum verwenden.

Wenn Sie eine Reihe von Transformationen durchführen, einen möglicherweise unendlichen Datenstrom ausführen oder eine Datei lesen, verwenden Sie Stream. Wenn Sie nur eine Transformation über eine endliche Aufzählung durchführen oder einen Stream auflösen müssen, verwenden Sie Enum.

Verwandte Themen