2011/09/01

C# ポインタを一行でポストインクリメントすると遅くなる

2011/02/06 追記: 実行環境下では JIT 最適化で、関係なくなるようだ。

C# では、*p++ は使わないほうがいい。
*p; p++; に分解すること。


Visual Studio 2010 version 10.0.30319.1
.Net Framework 4.0.30319
の話。/unsafe な release ビルド(最適化ON)。

volatile int r;
int[] a;

...

 unsafe {
  fixed (int* a0 = a) {
   int* p = a0;
   ...
   r = *p++;
   ...



の逆アセンブルウィンドウでの結果。

r = *p++;
0000008f mov  eax,dword ptr [ebp-8]
00000092 mov  dword ptr [ebp-10h],eax
00000095 add  dword ptr [ebp-8],4
00000099 mov  eax,dword ptr [ebp-10h]
0000009c mov  eax,dword ptr [eax]
0000009e mov  dword ptr ds:[007716C0h],eax

[ebp-10h]は一時変数。かなり間抜けだ。

r = *p++;



r = *p;
 p++;


に分けると、こうなる。

r = *p;
0000008f mov  eax,dword ptr [ebp-8] 
00000092 mov  eax,dword ptr [eax] 
00000094 mov  dword ptr ds:[005B16C0h],eax 
  p++;
00000099 add  dword ptr [ebp-8],4