2016-10-31 12 views
4

これは私が炎戦を始めようとしているように聞こえるかもしれませんが、私を聞いてください。私はElixirで列挙するEnumを好むべきでしょうか?

一部の言語では、怠惰は高価です。 (大規模なデータセットをページング思う)あなたは、メモリのためのCPUをトレードオフしなければならない

  • :それはときにのみ魅力的ですので、それは、繊維を使用して達成されますので、例えば、私が最も最近の経験を持つルビー、で、怠惰が遅いです
  • パフォーマンスの低下は、それが詳細を非表示する価値がある(繊維に降伏する代わりに、神秘的な場所で実行するようにブロックを下に渡すの抽象化、複雑に最適な方法です)

そうでなければ、あなたは間違いなく使用することをお勧めします通常の、熱心な方法。

私の最初の調査は、(Redditの上this threadが私をバックアップ)エリクシールで怠惰のためのオーバーヘッドが非常に低いことを示唆しているので、これまでの流れを行うことができますそれらのもののために代わりにストリームの列挙型を使用する理由はほとんどありそうです。

私は、Enumが理由で存在し、Streamと同じ機能をいくつか実装していると仮定しているため、紛失しているものがありますか?ストリームを使用できるときに、ストリームの代わりにEnumを使用したい場合、どのような場合がありますか?

答えて

8

短いリストの場合、Streamは単純にEnumを使用するよりも速度が遅くなりますが、何をしているのかをベンチマークすることなく明確なルールはありません。 Enumには存在するが、Streamでは対応する関数を持たない関数もあります。 (例:Enum.reverse)

本当に必要なのは、ストリームが単なる関数の構成であるということです。副作用ではなく、結果を必要とするすべてのパイプラインは、パイプラインを実行するためにEnumで終了する必要があります。

彼らは手を携えて行きます、ストリームは単独で立つことができませんでした。 Streamが主にやっているのは、非常に複雑なreduce関数を作成するための非常に便利な抽象化です。

+0

「非常に複雑なマップ関数」を意味すると思います – greggreg

+1

いいえ、私は減らすことを意味します。 mapはreduceの特別なケースです。 https://github.com/elixir-lang/elixir/blob/master/lib/elixir/lib/stream/reducers.ex –

+0

を参照してください。 – greggreg

6

ストリームのメソッドは、データの変換の「レシピリスト」を作成しますが、Enumのメソッドは実際にこれらの変換を解決します。ですから、他のすべてがStreamの場合でも、データ変換を解決するには、Enum関数を使用する必要があります。

また、いくつかの概念、つまりReduceはStreamでは本当の意味を持たず、Enumを使用する必要があります。

パフォーマンスに関して、実行している一連の変換、無限のデータストリーム、またはファイルを読み込んでいる場合は、ストリームを使用します。有限の列挙型に対して1つの変換しかない場合、またはストリームを解決する必要がある場合は、Enumを使用します。

関連する問題