2016-12-13 8 views
3

私はinlining declamationsにいくつかザッ読み取りを行い、relevant CLHS pagesをよく読んで、しかし簡単に明確な答えを見ることはできませんしました。`メソッド`を `インライン化 'することは可能ですか?

はそれがfooは(の後者は明示的にカバーケースである)というよりも、defundefmethodを使用して宣言されたときに(declaim (inline foo))に合理的ですか? fooclassreader機能の場合はどうですか?このインライン化の効果はパフォーマンス面で顕著ですか?それは何らかの実装固有のものですか?

厳密な制約のもとで、単純な方法では、具体的にはdefunのように書き直すのが妥当かもしれませんが、それは時には困難または不可能です。 Common Lispのメソッドを関数として書き直さなくてもそれを利用できる一般的な最適化戦略はありますか?それは呼ばれているものの機能を事前に確認することができたときの方法は、CLコンパイラがそれを行うことができますので、メソッドをインライン化

+1

を参照してください。https://github.com/guicho271828/inlined-generic-function – coredump

+0

@coredump - それによると、「インライン化する汎用関数/メソッドをインライン化すると、通常はパフォーマンスが無視できるほどに向上し、最適化されたケースでは、外部ライブラリを使用するコスト、余分なメタクラス宣言、最適化されていないケースではパフォーマンスが低下します。 'inline-generic-function'として' quicklisp'から利用できるので、探索するのが経済的です。 'reader' /' accessor'の場合にも当てはまるかどうか分かりますか?また、答えとして投稿したいですか? – Inaimathi

+1

Common Lispプログラムは個々のメソッドを呼び出すのではなく、汎用関数を呼び出すことに注意してください。 –

答えて

3

はほとんど意味がありません。インライン化されてfoo(foo x)への明示的な呼び出しがあった場合、fooの定義を置換することができます。ただし、コンパイルされるコードが(funcall method x y)の場合、methodが不明の場合、関数をインライン化することはできません。

そして、これは一般的な機能は何をすべきかです。実際には、自分でメソッドを呼び出すのではなく、オブジェクトシステムがどのメソッドを呼び出すべきかを決定させます。 CLOSではメソッドを追加したり削除したりすることができるため、システムが動的でランタイムコストがかかっているという事実に縛られる必要があります(実装によっては、変更を防ぐために汎用関数を封じ込めることができます)。しかし、実際には非常に便利で、開発時間を大幅に節約できます。私は、動的ディスパッチのコストが高すぎるケースはまだ見つけていませんが、非常に大きなセットのメソッドについての経験はありません。

あなたはより速く、一般的な派遣を作るについてのアイデアのためのロバートStrandhの論文Fast generic dispatch for Common Lispを見てすることができます。 Inlined Generic Functionsを提供するライブラリもあります。適切な環境下でコンパイル時に汎用関数を効率的にディスパッチできることは明らかです。

関連する問題