如您所知,我们需要使用declare
函数,如果我们想要使用函数而不在之前声明它,那么我的问题是使用declare
函数会导致任何性能问题吗?
Clojure有single pass compilation
因此我必须在那里进行某种权衡吗?
答案 0 :(得分:3)
Clojure没有单个传递编译器,只是编译单元不是文件。有关参考,请参阅this thread。所有声明都是在当前命名空间中定义一个没有值的var,以便以后可以重新定义。因此,对正常变量没有性能影响。
但是,如果您开始考虑优化代码,您可能会开始添加诸如定义某些代码的内联版本之类的内容,在声明调用和内联函数定义之间编译的任何内容都将没有内联的电话。
(declare some-func)
(defn other-func [] (some-func))
(defn some-func
{:inline (fn [] "test-inline")}
[] "test")
(other-func) ;;=> "test"
(defn other-func [] (some-func))
(other-func) ;;=> "test-inline"
答案 1 :(得分:1)
我按照以下方式尝试了Criterium:
(ns speed-test.core
(:require [criterium.core :as crit]))
(declare this)
(defn bench-this [] (crit/bench (this)))
(defn this [])
(defn that [])
(defn bench-that [] (crit/bench (that)))
我发现bench-this
和bench-that
之间没有显着差异。由于在两种情况下平均执行时间为7 - 8 ns,我感觉我们正在测量HotSpot无法完全放置的任何内容。