2009-08-27 10 views
6

私は確かなイエスかノーを期待していません。あなたが知っている知識が私は答えとして考えます。最適化が有効な場合、JITは常にこのメソッドをインライン化しますか?

private String CalculateCharge(Nullable<Decimal> bill, Nullable<Decimal> rate) 
{ 
    return ((bill ?? 0.0m) * (rate ?? 0.0m)).ToString("C"); 
} 
+0

これは「はい」とは言い難いですが、プライベートなので、私はそう思います。 –

+5

C#コンパイラは決して* anything *をインライン化しません。最適化のリストについては、jitコンパイラではなくC#コンパイラが実行します。対象に関する私の記事を参照してください。 http://blogs.msdn.com/ericlippert/archive/2009/06/11/what-does-the-optimize-switch-do.aspx –

+0

ありがとうエリック、私は多くの読書があるように見えます。 – ChaosPandion

答えて

21

インライン展開は、C#コンパイラではなく、JITの実装の詳細です。 Eric Gunnerson's blogから:

JITは にヒューリスティックの数を用いる方法がでライニング するかどうかを決定します。インライン化されないIL超える32バイトである

  • 方法: は、以下のもの(これは網羅的ではないことに注意し )の上位のリストです。
  • 仮想関数はインライン化されません。
  • 複雑なフロー制御を持つメソッドはインライン化されません。複雑な フロー制御は、if/then/else以外のフロー制御ではありません。 この場合は、スイッチまたはその間の です。
  • 例外処理ブロックを含むメソッドは にはインライン化されていませんが、 例外をスローするメソッドはまだ のインライン展開の候補です。
  • メソッドの仮引数のいずれかが構造体の場合、メソッドは にインライン化されません。

あなたの方法は非常に短く、非常に複雑ではないので、ヒューリスティックに一致する可能性がある、Nullable<T>ので、私はあなたのメソッドがインライン化されていないと思うだろうstructですが。

この方法をインライン化するとパフォーマンスが向上する場合は、JITがこのメソッドをインライン展開します。さもなければそれはしません。彼らはJITの将来のバージョンで変更される可能性があるので、私は慎重に明示的にこれらのヒューリスティックをコードする検討する

:しかし、これは本当にあなたがのためにコーディングする必要がありJITと何の実装の詳細です。インライン化されることを保証しようとするメソッドの正確性を損なうことはありません。

EDIT:どうやらインライン化されていない構造体について少しは外の日付です。更新された情報はVance Morrison's blogにあります。

+2

structオプションは、.NET 3.5sp1ではなくなりました。構造体のパラメータをインライン化することができます。 –

+0

@Reed Copsey:情報ありがとうございました。ポイントは実証済み:) – dtb

関連する問題