【发布时间】:2013-09-07 18:11:04
【问题描述】:
我想我会构建一个愚蠢的非尾递归乘法函数版本,看看它与正确的 TCO 相比如何。但是我注意到,在 REPL(我使用 Emacs 和为java -cp <classpath> clojure.main 配置为inferior-lisp)和从命令行调用程序时,显然正在发生某种优化/记忆。事实上,结果在 REPL 中更为明显。
(defn mult-silly [n m]
(if (> n 0)
(+ m (mult-silly (dec n) m))
0))
(dotimes [_ 5]
(println (time (mult-silly 5000 4))))
以上在 REPL 上产生:
user=> #'user/mult-silly
用户=>“经过的时间:10.697919 毫秒”
20000
“经过的时间:3.069106 毫秒”
20000
“经过的时间:2.301474 毫秒”
20000
“经过的时间:1.285696 毫秒”
20000
“经过的时间:0.585541 毫秒”
20000
知道为什么我会看到这个吗?
【问题讨论】:
-
可能是 JIT 编译器在起作用
-
关闭。最有可能与自适应优化相结合(代码运行得越多,优化得越积极)。
标签: clojure