我需要做一些特别的事情才能使用clojure.core/time吗?

too*_*ays 4 clojure

我正在调用clojure.core/time,记录为"Evaluates expr并打印它所花费的时间.返回expr的值"

例如:

(time (expensive))
Run Code Online (Sandbox Code Playgroud)

宏展开它表明它确实将值存储为let,因此在输出时应该立即返回let表达式中的值.

然而,当我使用昂贵的计算进行呼叫时,我看到延迟然后得到时间,但是必须等待很长时间(有时+10秒或更长时间)才能显示结果.

谁能解释一下这里发生了什么?

PS:这是使用clojure 1.3.0,如果这有任何区别.

Mic*_*ent 6

也许你正在返回一些懒惰的东西,其中的元素仅在送入REPL时生成?在这种情况下,您可能希望将其包装在dorun强制生成所有元素的区域中.

如果您能提供昂贵计算的详细信息,我们可以看出这是否属实.

来自Savanni D'Gerinel评论的有用补充:

(time (doall (computation)))如果要返回结果,可能是正确的语法,(time (dorun (computation)))如果不想.

  • 你正在测量你在里面做的事情所花费的时间:构建一个懒惰的seq,而不是消耗懒惰seq的所有元素(如果你正在做的事情,我仍然没有你的细节)."明确你想要的东西"是一种比隐含的doall更灵活的设计.这是我能提出的一个原因,虽然我没有设计"时间";). (2认同)