[解決済み] フィールドとプロパティの比較 パフォーマンスの最適化
質問
この質問はパフォーマンスのみに関連していることに注意してください。設計指針、哲学、互換性、移植性、および純粋な性能に関連しないものはすべて省略しましょう。ありがとうございました。
さて、質問です。私はいつも、C# のゲッター/セッターは実際には偽装されたメソッドであるため、パブリック フィールドの読み取りはゲッターを呼び出すよりも高速でなければならないと仮定しています。
そこで、私はテスト(以下のコード)を行って確認しました。しかし、このテストは期待された結果しか出しません (すなわち フィールドはゲッターよりも速く、34%です。 ) もし であれば、Visual Studioの内部から実行します。
コマンドラインから実行すると、ほぼ同じタイミングで表示されるのですが...。
唯一の説明は、CLRが追加の最適化を行うことです(私がここで間違っているならば、訂正してください)。
これらのプロパティがより洗練された方法で使用される実際のアプリケーションでは、同じ方法で最適化されるとは思えません。
現実の生活では、プロパティはフィールドよりも遅いという考えを証明または反証するために私を助けてください。
質問は、CLR が動作を変更し、パブリック フィールドがゲッターを上回るようにするには、どのようにテスト クラスを修正すればよいかということです。または、内部ロジックのない任意のプロパティがフィールドと同じように動作することを教えてください (少なくともゲッターで)。
EDIT: 私は Release x64 ビルドについてだけ話しています。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace PropertyVsField
{
class Program
{
static int LEN = 20000000;
static void Main(string[] args)
{
List<A> a = new List<A>(LEN);
List<B> b = new List<B>(LEN);
Random r = new Random(DateTime.Now.Millisecond);
for (int i = 0; i < LEN; i++)
{
double p = r.NextDouble();
a.Add(new A() { P = p });
b.Add(new B() { P = p });
}
Stopwatch sw = new Stopwatch();
double d = 0.0;
sw.Restart();
for (int i = 0; i < LEN; i++)
{
d += a[i].P;
}
sw.Stop();
Console.WriteLine("auto getter. {0}. {1}.", sw.ElapsedTicks, d);
sw.Restart();
for (int i = 0; i < LEN; i++)
{
d += b[i].P;
}
sw.Stop();
Console.WriteLine(" field. {0}. {1}.", sw.ElapsedTicks, d);
Console.ReadLine();
}
}
class A
{
public double P { get; set; }
}
class B
{
public double P;
}
}
どのように解決するのですか?
すでに他の方がおっしゃっているように、ゲッターは インライン .
インライン化を回避したい場合は
-
自動プロパティを手動プロパティに置き換える。
class A { private double p; public double P { get { return p; } set { p = value; } } }
-
で、ゲッターをインライン化しないようにコンパイラに指示します(気が向いたら両方でも)。
[MethodImpl(MethodImplOptions.NoInlining)] get { return p; }
最初の変更ではパフォーマンスに違いはありませんが、2 番目の変更ではメソッド呼び出しのオーバーヘッドが明確に示されていることに注意してください。
手動プロパティ。
auto getter. 519005. 10000971,0237547.
field. 514235. 20001942,0475098.
ゲッターのインライン化を行わない。
auto getter. 785997. 10000476,0385552.
field. 531552. 20000952,077111.
関連
-
[解決済み】「...は'型'であり、与えられたコンテキストでは有効ではありません」を解決するにはどうすればよいですか?(C#)
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] C#のオートプロパティに初期値を与える最良の方法は何ですか?
-
[解決済み] 0.1fを0にすると、なぜ10倍もパフォーマンスが落ちるのですか?
-
[解決済み] List<T>をオブジェクトのプロパティでソートする方法
-
[解決済み] フィールドとプロパティの違いは何ですか?
-
[解決済み] 特定のプロパティに対するLINQのDistinct()
-
[解決済み] Swift Betaのパフォーマンス:配列のソート
-
[解決済み] 文字列の最初の文字を大文字にする(最大限のパフォーマンスを発揮する)
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Ajax処理で「無効なJSONプリミティブ」と表示される件
-
[解決済み】「namespace x already contains a definition for x」エラーの修正方法は?VS2010にコンバートした後に発生しました。
-
[解決済み】Unity 「関連するスクリプトを読み込むことができません」「Win32Exception: システムは指定されたファイルを見つけることができません"
-
[解決済み】Moqを使用してメソッド呼び出しを検証する
-
[解決済み】5.7.57 SMTP - MAIL FROMエラー時に匿名メールを送信するためにクライアントが認証されない
-
[解決済み】2年前のMSDateを把握する【クローズド
-
[解決済み】エラー「必要なフォーマルパラメータに対応する引数が与えられていない」を解決する?
-
[解決済み】プロセスが実行されているかどうかを知るには?
-
[解決済み】Microsoft.Extensions.LoggingからILoggerを解決することができない
-
[解決済み】ユーザー設定値を別のユーザー設定値で設定する