在Clojure documentation on type hinting中,它有关于类型提示和强制如何使代码运行得更快的以下示例:
(defn foo [n]
(loop [i 0]
(if (< i n)
(recur (inc i))
i)))
(time (foo 100000))
"Elapsed time: 0.391 msecs"
100000
(defn foo2 [n]
(let [n (int n)]
(loop [i (int 0)]
(if (< i n)
(recur (inc i))
i))))
(time (foo2 100000))
"Elapsed time: 0.084 msecs"
100000
如果您使用(set! *warn-on-reflection* true)
运行此代码,则不会显示反射警告。是否需要程序员试错才能看出这些装饰品在哪些方面有所不同?或者是否有工具指示有问题的区域?
答案 0 :(得分:2)
嗯,你可以很好地估计这一点,只需考虑经常遇到代码的哪些部分。
或者您可以使用某种类型的普通分析器。我建议VIsual VM,你可以使用clojure。然后你只需将它们放在你看到的大多数时间的方法中(它也会显示你对java.lang.reflect.Method的调用,如果这个被调用很多,你应该考虑使用类型提示)。