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

时间:2016-10-31 19:27:53

标签: performance enums stream elixir

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

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

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

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

我的初步调查显示,Elixir中懒惰的开销要低得多(reddit上的this thread支持我),所以似乎没有理由使用Enum而不是Stream来处理Stream可以做的事情。

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

2 个答案:

答案 0 :(得分:9)

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

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

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

答案 1 :(得分:7)

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

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

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