私はImproving .NET Application Performance and Scalabilityを読んでいました。 が繰り返しフィールドまたはプロパティアクセスを避けるというタイトルのセクションでは、ガイドラインが含まれていますループの間静的なままであるプロパティのコンパイラの最適化
あなたがループの期間中に静的なデータを使用している場合は、代わりに繰り返しフィールドまたはプロパティにアクセスするループの前にそれ を得ます。
次のコードは、この例のように与えられる:
for (int item = 0; item < Customer.Orders.Count; item++)
{
CalculateTax(Customer.State, Customer.Zip, Customer.Orders[item]);
}
は
string state = Customer.State;
string zip = Customer.Zip;
int count = Customers.Orders.Count;
for (int item = 0; item < count; item++)
{
CalculateTax(state, zip, Customer.Orders[item]);
}
物品状態になる:これらのフィールドである場合、その
注意、それはコンパイラのために可能性があります この最適化を行う自動lly。それらがプロパティの場合は、多くは です。プロパティが仮想の場合は、自動的に を実行することはできません。
この方法でコンパイラによってプロパティを最適化するのはなぜですか?なぜ特定のプロパティを最適化するかどうかをいつ期待できますか?アクセサーで追加の操作が実行されるプロパティはコンパイラが最適化するのが難しく、バッキングフィールドのみを変更するものは最適化される可能性が高いと思いますが、いくつかのより具体的なルールが必要です。自動実装されたプロパティは常に最適化されていますか?
また、バッキングフィールドの値を返すだけであっても、コンパイラーはバッキングフィールドがループ全体で変更できないことを証明する必要があります。これは、難しい(しばしば不可能な)ことですほとんどの場合。 – Servy
@Servy:そうですが、これはフィールドと同じ場合、コンパイラがこの最適化を自動的に行うことが可能であることに注意してください。 –
コンパイラが* only *プロパティを返すことが証明できる場合フィールドの値、* then *同じ値。それは、プロパティがそれを行うかどうかを知っているかもしれません。 @EricJ。 – Servy