方案中的流效率

时间:2014-12-24 19:40:37

标签: performance stream scheme lisp racket

据我所知,在大型程序中使用流比在DrRacket中使用普通的lisp更有效。为什么默认评估不是在DrRacket中进行延迟评估?我写了一个计时器程序来计算工作所需的时间要完整,在每个复杂的程序中,懒惰的评估都要快得多。

1 个答案:

答案 0 :(得分:3)

当您执行类似排序的操作时,AFAIK使用流是浪费周期,因为您需要完成排序才能知道第一个元素。如果你的任务类似于一种排序,那么你需要评估整个集合,那么你最终会花费更多的时间而不是没有流。原因是整个流系统既有成本也有好处。

流的好处是你可以并行进行计算,这样程序在处理第一个元素之前就不需要做一个完整的循环。如果您有n层处理流,那么当您的程序退出并且所有其他图层都没有为您提供服务时,您将从中受益。

DrRacket不是一种语言,而是一种IDE。 Racket既是一种语言(#!racket作为第一行源),也是实现它的实现的名称。

Racket支持#!lazy这是一个懒惰的Racket版本。基本上一切都像流一样,无处不在。您将获得相同的收益和成本。

所提到的语言都不是Scheme,但#!racket基于#!r5rs并且是#!r6rs的超集。从那时起,您拥有#!r7rs和新delay。官方计划报告都不是懒惰的。原因是它的前任急切而且懒惰会彻底改变语言并破坏所有向后兼容性。

1975年Scheme的创新是词汇封闭。创建者在以后的报告中根据需要进行了懒惰评估(通过实施force和{{1}})。其他语言,如Haskell,都是从地面开始构建的,它们有一个更高级的编译器来恒定折叠并使其代码变得活泼。