【发布时间】:2016-11-11 01:08:25
【问题描述】:
我将这个基本宏用作其他计时宏的构建块:
(defmacro time-pure
"Evaluates expr and returns the time it took.
Modified the native time macro to return the time taken."
[expr]
`(let [start# (current-nano-timestamp)
ret# ~expr]
(/ (double (- (current-nano-timestamp) start#)) 1000000.0)))
我已经对此进行了测试,并在其他宏中使用了它,所以我知道它可以正常工作。
我的问题可以用下面的sn-p来描述:
(defmacro time-each [& exprs]
`(mapv #(time-pure %) '~exprs))
我希望这会将每个表达式提供给time-each,在那里它执行并计时;返回结果。但是,当我对其进行测试时,它会立即完成:
(time-each
(Thread/sleep 500)
(Thread/sleep 1000))
[0.036571 0.0]
我对此感到困惑,因为我知道 (time-pure (Thread/sleep 1000)) 将需要大约一秒钟的时间才能返回,并且所有这些宏都会委托给 time-pure。
这是什么原因造成的?我真的不知道如何正确调试宏。我使用macro-expand-1 来检查生成的代码:
(clojure.pprint/pprint
(macroexpand-1
'(time-each
(Thread/sleep 500)
(Thread/sleep 1000))))
(clojure.core/mapv
(fn*
[p1__1451__1452__auto__]
(helpers.general-helpers/time-pure p1__1451__1452__auto__))
'((Thread/sleep 500) (Thread/sleep 1000)))
但对我来说没有什么特别突出的。
这是怎么回事?
(注意,这是我几分钟前发布的一个问题的欺骗。我意识到我展示的案例很复杂,所以我编了一个更好的例子。)
【问题讨论】:
-
你想让我把另一个链接到这个吗?
-
@ArthurUlfeldt 好吧,我删除了它,所以只有非常高级的用户才能看到它。除了使用的代码之外,它基本上是相同的。回想起来,我可能应该刚刚编辑了原件。我不知道为什么我提出了一个新问题。