我是否应该更喜欢Enum在Elixir中流?

G G*_*III 5 performance enums stream elixir

这可能听起来像是我要求开始一场火焰战,但是听我说.

在某些语言中,懒惰是昂贵的.例如,在我拥有最新体验的Ruby中,懒惰是缓慢的,因为它是使用光纤实现的,所以它在以下情况下才有吸引力:

  • 你必须用cpu换取内存(想想通过大数据集进行分页)
  • 性能损失是值得隐藏的细节(屈服于纤维是一个很好的方式来抽象复杂性,而不是传递块在神秘的地方运行)

否则你肯定想要使用正常的,急切的方法.

我最初的调查表明,Elixir中懒惰的开销要低得多(reddit上的这个帖子支持我),所以似乎没有理由使用Enum而不是Stream来处理Stream可以做的事情.

是否有一些我缺少的东西,因为我认为Enum存在是有原因的并且实现了一些与Stream相同的功能.如果有的话,我可以在使用Stream时使用Enum而不是Stream?

Fre*_*Dog 9

对于简短的列表,Stream将比简单地使用Enum慢,但没有明确的规则,没有准确的基准测试你正在做什么.Enum中也存在一些函数,但在Stream中没有相应的函数.(例如,Enum.reverse)

你需要两者的真正原因是Stream只是一个功能组合.需要结果而不是副作用的每个管道都需要以Enum结束才能运行管道.

它们齐头并进,Stream无法独自站立.Stream正在做的主要是为您提供非常方便的抽象,以创建非常复杂的reduce函数.

  • 不,我的意思是减少。map 是reduce 的一个特例。见 https://github.com/elixir-lang/elixir/blob/master/lib/elixir/lib/stream/reducers.ex (2认同)

gre*_*reg 7

Stream中的方法实际上创建了一个转换数据的"配方列表",而Enum中的方法实际上解决了这些转换.因此,即使其他所有内容都是Stream,您最终也必须使用Enum函数来解析数据转换.

还有一些概念,即Reduce,在Stream中没有实际意义,你必须使用Enum.

至于性能,如果您正在执行一系列转换,可能是无限的数据流,或者您正在读取文件,请使用Stream.如果您只对有限可枚举进行一次转换,或者需要解析流,请使用Enum.