3

これは初心者の質問のようなものです。私は単純なプロパティを持っています

bool IsRoot { get { return parent==null; } }

クラス (および派生クラス) 内の他のプロパティやメソッドから何度も呼び出します。

コードを (私にとって) 読みやすくするため、このようにしておくのが好きですがIsRoot、最終リリース コードでは「インライン化」されていない可能性があるため、すべての呼び出しが遅くなるのではないかと心配しています。「インライン」とは、 のparent==null代わりに評価のコピーに置き換えられるということですget_IsRoot()

プロパティがC#でインライン化されている場合(または場合)、およびパフォーマンス指向のアプリケーションの場合、プロパティを回避する必要があるかどうかを誰かが説明できますか?

EDIT_1 : 簡単な答えは次のとおりです。プロパティは純粋な関数呼び出しに変換され、JIT の決定に応じてインライン化される場合とされない場合があります。プロファイラーが使用され、最終結果がパフォーマンスのために微調整されない限り、システムが正しい選択を行うことを信頼し、5% から 10% のレベルで物事に影響を与える可能性があることについて心配する必要はありません。

リンクの SO コミュニティに感謝します。複数の正解を与える方法があったことを願っています。申し訳ありませんが、1つを選択する必要がありました。

4

1 に答える 1

2

これは、インライン化について話しているEric Gunnerson の古い投稿です。
要点は、ジッターが関数をインライン化するかどうかを決定することです。私の理解では、小さな関数を書くことでインライン化をある程度「奨励」することができますが、それが実際にどれほど信頼できるかはわかりません。

これは、同様の質問をする SO に関する質問からの別のリンクです。多くの良いリンクが含まれています。

以下は、私が投稿した 2 番目のリンクからのリンクの 1 つからの抜粋です。

頻繁に使用される短くて単純なメソッドは、呼び出しコードにインライン化できます。現在、JIT は、長さが 32 バイト未満で、複雑な分岐ロジックを含まず、例外処理関連のメカニズムを含まないメソッドをインライン化するように文書化されています (おそらく、ここでは「ブログについて」のほうが正確です)。このトピックに関する追加情報については、David Notario のブログを参照してください (CLR 2.0 に完全に関連しているわけではないことに注意してください)。

メソッドがインライン化される可能性がある場合の大まかなガイドラインとしてカウントされると思いますが、メソッドが上記の基準を満たしていればインライン化されるとは言えません。

補足として、次のように関数を強制的にインライン化しないようにすることができます。

[MethodImpl(MethodImplOptions.NoInlining)]
public void DoNotInlineMe()
{
  Console.WriteLine("Hello from non-inlined method");
}
于 2010-11-08T21:05:52.110 に答える