2

.Net Compact Framework でいくつかの図形を描画しているときに、驚くべき結果がいくつか見つかりました。

Method1 と Method2 はいくつかの長方形を描画しますが、Method1 は Method2 よりも高速です。コードは次のとおりです。

方法1:

int height = Height;
for (int i = 0; i < data.Length; i++)
{
  barYPos = Helper.GetPixelValue(Point1, Point2, data[i]);

  barRect.X = barXPos;
  barRect.Y = barYPos;
  barRect.Height = height - barYPos;
  //
  //rects.Add(barRect);
  _gBmp.FillRectangle(_barBrush, barRect);
  //
  barXPos += (WidthOfBar + DistanceBetweenBars);
} 

方法 2:

for (int i = 0; i < data.Length; i++)
{
  barYPos = Helper.GetPixelValue(Point1, Point2, data[i]);

  barRect.X = barXPos;
  barRect.Y = barYPos;
  barRect.Height = Height - barYPos;
  //
  //rects.Add(barRect);
  _gBmp.FillRectangle(_barBrush, barRect);
  //
  barXPos += (WidthOfBar + DistanceBetweenBars);
} 

2 つの唯一の違いは、コントロールの をローカル変数にMethod1格納していることです。Height

.Net Compact Framework での描画の理由とガイドラインを誰か説明してもらえますか?

4

3 に答える 3

3

方法 2 は、for ループの反復ごとに Height プロパティにアクセスしているため、処理が遅くなります。このプロパティは計算に時間がかかる場合があり、ループ外のローカル変数に入れるとキャッシュとして機能します。

于 2012-07-27T12:35:16.187 に答える
1

C# でのプロパティの呼び出しには、メモリ内の変数に直接アクセスする場合よりも関連コストがかかります。プロパティは、バックグラウンドでバッキング フィールドを持つメソッドとして生成されるため (および/またはさらに悪いことに、おそらく他の何かをクエリします!)

アプリケーションが実際にシングル スレッドであり、それをキャッシュする余裕がある場合は、そうしてください。タイトなループ内のプロパティは避けてください。

于 2012-07-27T12:51:38.393 に答える
0

Heightそれはあなたが何度もアクセスしたからだと思いますdata.Lenght。最初の方法では、一度だけ初期化します。

于 2012-07-27T12:35:25.580 に答える