如何知道在Clojure中放置类型提示以提高数值性能?

时间:2015-10-08 09:49:11

标签: performance clojure

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)运行此代码,则不会显示反射警告。是否需要程序员试错才能看出这些装饰品在哪些方面有所不同?或者是否有工具指示有问题的区域?

1 个答案:

答案 0 :(得分:2)

嗯,你可以很好地估计这一点,只需考虑经常遇到代码的哪些部分。

或者您可以使用某种类型的普通分析器。我建议VIsual VM,你可以使用clojure。然后你只需将它们放在你看到的大多数时间的方法中(它也会显示你对java.lang.reflect.Method的调用,如果这个被调用很多,你应该考虑使用类型提示)。