2011-12-08 25 views
4

我打电话被记录为clojure.core /时间我需要做一些特殊的事情来使用clojure.core/time?

如“的计算EXPR并打印花时间返回expr的值。”:

(time (expensive)) 

Macroexpanding它表明,它确实将值存储为let,以便在输出时间后立即返回let表达式中的值。

当我通过昂贵的计算器进行通话时,会看到延迟,然后返回时间,但必须等待显着的时间(有时为+10秒或更长)才能显示结果。

任何人都可以解释这里发生了什么? PS:这是使用clojure 1.3.0,如果这有什么不同。

回答

6

也许你正在返回一些懒惰的东西,其中的元素只有在提供给REPL时才会产生?在这种情况下,您可能想要将其包装在dorun中,这将强制所有元素生成。

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

有益的补充,从Savanni D'Gerinel的评论:

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

+0

这几乎是一个懒惰的问题。之前我问过一个问题,我正在分析一个手术,起初手术时间很短。然后我意识到,直到后来它才真正被计算出来。如果你想返回结果,那么正确的语法可能是(time(doall(comput))),如果你不想返回结果和(time(dorun(calculate)))。 –

+0

如果是这种情况,为什么不包含doall?人们会认为,如果你计算一些你想知道它实际需要多长时间的东西? – toofarsideways

+2

你正在测量你正在做什么的时间:构建一个懒惰的seq,而不是消耗懒惰seq的所有元素(如果这就是你正在做的事情,但我没有你的细节)。 “明确你想要什么”是一个比隐式doall更灵活的设计。这是我能想到的一个原因,虽然我没有设计“时间”;)。 –

相关问题