ご存知のように私はdeclare
機能を使用する必要があります。私は以前に宣言していない関数を使用していましたので、私の質問ではdeclare
関数を使用するとパフォーマンス上の問題が発生しますか?関数を宣言してもClojureのパフォーマンスに問題はありますか?
Clojureはsingle pass compilation
なので、そこには何らかのトレードオフがありますか?
ご存知のように私はdeclare
機能を使用する必要があります。私は以前に宣言していない関数を使用していましたので、私の質問ではdeclare
関数を使用するとパフォーマンス上の問題が発生しますか?関数を宣言してもClojureのパフォーマンスに問題はありますか?
Clojureはsingle pass compilation
なので、そこには何らかのトレードオフがありますか?
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"
次のように私はクリテリウムを試してみました:
(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が決めることのできないものの幽霊を測定していると感じます。
Clojureには、シングルパスコンパイルが正確にはありません。http://stackoverflow.com/a/33144157/1327651 – nha