2012-03-14 7 views
43

documentation状態:関数にINLINABLEプラグマを使用しない理由はありますか?

アン{ - - #INLINABLEのF#}関数fのプラグマは、次のような動作があります。INLINEは "私をインライン化してください" と言いながら

  • を、INLINABLE氏は述べています"私をインラインで自由に感じてください;あなたの裁量で"。言い換えれば、プラグマフリー関数と同じ規則を使用するGHCに任せられます。 INLINEとは異なり、その決定はコールサイトで行われるため、インライン化しきい値、最適化レベルなどの影響を受けます。

  • INLINABLEプラグマは、インライン化の目的で元のRHSのコピーを保持し、 RHSのサイズにかかわらず、インターフェイスファイルに格納されます。

  • INLINABLEを使用する1つの方法は、特殊な関数inline(7.18項「特殊な組み込み関数」)と組み合わせて使用​​します。コールのインラインfは、インラインにするのが非常に難しいです。 fをインライン化できるようにするには、fの定義をINLINABLEとしてマークし、GHCがその大きさにかかわらず展開を公開することを保証することをお勧めします。さらに、fに注釈を付けることにより、f GHCのオプティマイザがランダムに最適化したバージョンではなく、fの元のRHSがインライン展開されるようにします。

  • INLINABLEプラグマは、SPECIALIZEでも機能します。関数fをINLINABLEとマークすると、別のモジュールでSPECIALIZEできます(7.16.8項「SPECIALIZEプラグマ」を参照)。

  • INLINEとは異なり、再帰関数にはINLINABLEプラグマを使用できます。主な理由は、そう

それの欠点は何ですかSPECIALIZE

を後で使用できるようにするのですか?

インターフェイスファイルをはるかに大きくしますか?それはコンパイルをずっと遅くしますか?

書き出したすべての関数にINLINABLEプラグマを入れない理由はありますか? GHCが書き出したすべての関数にINLINABLEプラグマを入れない理由はありますか?

答えて

49

INLINABLEを使用し、全くプラグマを使用していない間に3つの違いがあります。

  • が、それは、インタフェースファイルに行く定義がINLINABLEとのに対し、最適化後のコードで、INLINABLEなしであなたが書いたコードです(多かれ少なかれ)。特に、INLINABLEを指定しない場合、GHCは他の関数を関数の定義にインライン展開することがあります。

  • INLINABLEを指定しない場合、GHCはインターフェイスファイルからの定義が大きすぎる場合、その定義を省略します。他の関数が右側にインライン展開されていると、これを簡単に限界に押し上げることができます。

  • INLINABLEは、使用されているオーバーロードされた関数を自動的に特殊化し、専用バージョンが作成されたモジュールを推移的にインポートする他のモジュールと共有します。

+9

私は実際的な影響を理解しようとしています。最初のポイントは、関数がインライン化されていない場合、最適化されていないコードを使用し、速度が遅くなることを意味しますか?または、インライン化されてもルールが起動しない場合は遅くなりますか?あるいは時々より速くなることもあれば、場合によっては遅くなることもありますか? 2番目の点に関しては、それをディスクスペース以外のインターフェースファイルに含めることには何らかの欠点がありますか?ディスクが大きすぎて問題になることはありますか?そして、再:第3のポイントは、それは未改正の良いものではない何らかの理由はありますか?コードの膨大な量が問題になることはありますか? – glaebhoerl

+4

GHCを使ってコードを膨らませないインラインの変種が必要だったので、私はサイモンPJにインライン展開を納得させましたので、ほとんどの場合、私は実際に分かりませんでした。インラインにするときの非常に洗練されたヒューリスティックス。あなたの最初の質問に答えるために:いいえ、(INLINEのように)元のモジュールにコンパイルされた関数の最適化バージョンもあり、これはインライン化されていない呼び出しに使用されます。インターフェイスにたくさんの関数定義を含めると、処理が遅くなる可能性があります。 –

+0

ええ、大丈夫です。使用する時期と使用しない時期についてのガイドラインがあるのはいいですが、実験しなければならないと思います。 :) – glaebhoerl

関連する問題