2011-12-08 5 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 (dorun (computation)))を返すようにしたい場合は

適切な構文は、おそらく(time (doall (computation)))です。

+0

これは、ほとんど間違いなく怠惰の問題です。私は操作をプロファイリングしていた以前の質問をしましたが、最初は操作が驚くほど短時間でした。その後、実際に計算されていないことがわかった。正しい構文はおそらく結果を返す場合は(time(doall(計算))、そうでない場合は(time(dorun(計算)))です。 –

+0

そのような場合にdoallを含む時間がないのはなぜですか?あなたが何かをタイミングしているなら、実際にどれくらいの時間がかかるかを知りたいと思うでしょうか? – toofarsideways

+2

あなたはあなたが内部で何をしているかを正確に測定しています:怠惰なseqを構築し、怠惰なseqのすべての要素を消費しないでください(もしあなたがしているなら、あなたの詳細はありません)。 「あなたが望むものを明示する」とは、暗黙のdoallよりも柔軟な設計です。私は「時間」をデザインしていませんでしたが、それが私が思いつく一つの理由です)。 –

関連する問題