2011-12-08 23 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更靈活的設計。這是我能想到的一個原因,雖然我沒有設計「時間」;)。 –

相關問題