2013-06-05 1 views

答えて

5

私はプリミティブの引数に適用される場合は特に、コンパイラは、incのような特定のコア機能をインライン化と信じています。

incを通常の関数(たとえば、高次関数に渡し、letなどのエイリアス)として使用すると、パフォーマンスが低下する可能性があります。余分なオーバーヘッドは余分な関数呼び出しを作成することから来ています、おそらくボクシングのコストも1つ以上の引数です。

これはClojureの制限ではなく、コンパイラがまだその最適化では洗練されていないという事実を反映しています。 Clojureの将来のバージョンでは、このようなことがもっとうまくいくと期待できます。

+2

これはまさに正しいことです。 'inc'はインラインであり、' i'はプリミティブなlongであることが知られているので、コンパイラは実際には 'clojure.lang.Numbers'のメソッドをバイパスして1バイトコード演算で1を加えます。 – amalloy

5

mikeraがインライン展開について言及した内容を追加するだけです。 incは関数にバインドされたvarです。 metaの文字列がinc、つまり(meta #'inc)である場合、:inlinerのキーがあり、コンパイラがincのコードを使用して関数のコードをインライン化するために使用できることがわかります。inc varletを使用してローカルにバインドすると、関数オブジェクトをローカルスコープの新しい名前にバインドするだけで、関数オブジェクトにはインライン情報がありません。その情報を持つinc varであったため、インライン化できません。

関連する問題