例はそれをすべて言います:
user> (time (dotimes [i 10000000] (inc i)))
"Elapsed time: 413.948711 msecs"
nil
user> (time (let [new-inc inc] (dotimes [i 10000000] (new-inc i))))
"Elapsed time: 1034.722729 msecs"
nil
例はそれをすべて言います:
user> (time (dotimes [i 10000000] (inc i)))
"Elapsed time: 413.948711 msecs"
nil
user> (time (let [new-inc inc] (dotimes [i 10000000] (new-inc i))))
"Elapsed time: 1034.722729 msecs"
nil
inc
特にプリミティブ引数に適用された場合、コンパイラは のような特定のコア関数をインライン化すると思います。
したがって、通常の関数として使用する場合inc
(たとえば、高次関数への受け渡し、エイリアシングlet
など)、インライン化の機能が失われるため、パフォーマンスが低下する可能性があります。追加のオーバーヘッドは、追加の関数呼び出しを行うことから生じます。また、1 つまたは複数の引数をボックス化するコストも考えられます。
これは Clojure の制限ではなく、コンパイラがまだ最適化に関してあまり洗練されていないという事実を反映しているだけです。おそらく、Clojure の将来のバージョンでは、このような機能が大幅に改善されることが期待できます。