2012-05-02 15 views
3

オブジェクトプロパティをループ内で直接使用するのではなく、まず変数に割り当てる方が良いですか?ループ内のオブジェクトプロパティへのアクセス

私はビットマップBitmap img = new Bitmap("image.jpg")を持っていると言いますが、何らかの処理を行うにはすべてのピクセルをループする必要がありました。約200万画素の1080p画像の場合。 data.Strideを使用するか、最初に変数に割り当てる場合は重要ですかint dataStride = data.Stride?私はオフセットを計算するたびにそれにアクセスする必要がありますが、dataStrideはイメージの定数です。

data = editImage.LockBits(new Rectangle(0, 0, editWidth, editHeight), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); 
byte* dataPtr = (byte*)data.Scan0; 
dataStride = data.Stride; 

私はそれが最初のオブジェクト(たび)にアクセスし、次に遅いオブジェクト(各回)の整数にアクセスしなければならないことを考えていますので、私は最初の変数に割り当てます。そしてそれは大きなループなので...それは合体する。したがって、最初に変数にプロパティを割り当てることは、int値に直接アクセスできるため、高速になります。これは正しいです?

+1

System.Diagnostics.StopWatchまたはProfilerを使用して、両方の方法で記述し、リリースモードでの複数回の実行でパフォーマンスを測定します。誰かがバイトポインタに対して実際にそれを測定しない限り、どちらかが速いかもしれないコーナーケースがたくさんありますが、汎用情報はそれほど有用ではありません。 –

答えて

2

はい。どんなに単純なプロパティであっても、それにアクセスするにはまだ関数呼び出しのオーバーヘッドがあります。変数は、特にあなたが何百万回何かをしている場合は、高速です。

+1

これは間違っています。プロパティはJITerによってインライン化することができます –

+0

@lukasに同意すると、コンパイラとCLRは(ローカルの@Ryderを使って少しでも助けることができるとしても)トリックを行うためにはるかに最適化されています。 –

+0

はい、いいえ。配列をループするとき、JITterは通常境界検査を無効にすることができます。 - for(i = 0; i

関連する問題