2017-04-13 8 views
0

ご存知のように私はdeclare機能を使用する必要があります。私は以前に宣言していない関数を使用していましたので、私の質問ではdeclare関数を使用するとパフォーマンス上の問題が発生しますか?関数を宣言してもClojureのパフォーマンスに問題はありますか?

Clojureはsingle pass compilationなので、そこには何らかのトレードオフがありますか?

+0

Clojureには、シングルパスコンパイルが正確にはありません。http://stackoverflow.com/a/33144157/1327651 – nha

答えて

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

次のように私はクリテリウムを試してみました:

(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-thisbench-thatの間に有意差を見つけることができませんでした。どちらの場合も平均実行時間は7〜8 nsなので、HotSpotが決めることのできないものの幽霊を測定していると感じます。

関連する問題