2012-03-21 6 views
3

私は20/30オブジェクトのようにループしているとか、小数点を扱っている他のケースでは、intの代わりにshortを使うのは良い方法ですか?短い使用方法は?

私はなぜこの一般的ではありません意味:それはパフォーマンスゲインが低すぎるため

for(short i=0; i<x; i++) 
    Method(array[i]); 

ですか?

ありがとうございました

+0

[Int16型VS .NET整数?](http://stackoverflow.com/questions/129023/net-integer-vs-int16)の重複の –

+0

可能重複[Int16型VS .NET整数?]( https://stackoverflow.com/questions/129023/net-integer-vs-int16) – DavidRR

答えて

10

は、 "intの代わりに短い使用することをお勧めします?"増加速度や効率:

まず第一に、これは予想される結果を達成することはありませんマイクロ最適化です。

第二:いいえ、本当に、CLRは内部でまだ反復を実行するために32ビット整数(のInt32)を使用していません。基本的には、JITコンパイル時に計算目的でshortをInt32に変換します。

サード:配列インデックスは、のInt32であり、反復短い変数が自動的に配列インデクサとして使用される場合INT32に変換されます。

我々は次のコードを取る場合:

var array = new object[32]; 
    var x = array.Length; 
    for (short i = 0; i < x; i++) 
     Method(array[i]); 

をし、それを分解し、あなたがマシンレベルで32ビット・レジスタは切り捨て次である、反復変数(EAX)のために使用されたことを00000089 inc eaxではっきりと見ることができます16ビットへ0000008a movsx eax,ax int32を使用するのに短期間使用するとメリットはありませんが、実際に実行する必要がある余分な命令のためにわずかなパフォーマンスの低下が生じる可能性があります。

00000042 nop 
      var array = new object[32]; 
00000043 mov   ecx,64B41812h 
00000048 mov   edx,20h 
0000004d call  FFBC01A4 
00000052 mov   dword ptr [ebp-50h],eax 
00000055 mov   eax,dword ptr [ebp-50h] 
00000058 mov   dword ptr [ebp-40h],eax 
      var x = array.Length; 
0000005b mov   eax,dword ptr [ebp-40h] 
0000005e mov   eax,dword ptr [eax+4] 
00000061 mov   dword ptr [ebp-44h],eax 
      for (short i = 0; i < x; i++) 
00000064 xor   edx,edx 
00000066 mov   dword ptr [ebp-48h],edx 
00000069 nop 
0000006a jmp   00000090 
       Method(array[i]); 
0000006c mov   eax,dword ptr [ebp-48h] 
0000006f mov   edx,dword ptr [ebp-40h] 
00000072 cmp   eax,dword ptr [edx+4] 
00000075 jb   0000007C 
00000077 call  657A28F6 
0000007c mov   ecx,dword ptr [edx+eax*4+0Ch] 
00000080 call  FFD9A708 
00000085 nop 
      for (short i = 0; i < x; i++) 
00000086 mov   eax,dword ptr [ebp-48h] 
00000089 inc   eax 
0000008a movsx  eax,ax 
0000008d mov   dword ptr [ebp-48h],eax 
00000090 mov   eax,dword ptr [ebp-48h] 
00000093 cmp   eax,dword ptr [ebp-44h] 
00000096 setl  al 
00000099 movzx  eax,al 
0000009c mov   dword ptr [ebp-4Ch],eax 
0000009f cmp   dword ptr [ebp-4Ch],0 
000000a3 jne   0000006C 
+0

ありがとうございました。それは物事をクリアする。 – farooq

+0

したがって、intを使ってshortまたはbyteを使用すると便利なのはいつですか? – Sir

+0

まあこれはちょっと不愉快な返事です..... – Sir

1

はい、パフォーマンスの差はごくわずかです。しかし、shortはintの場合32ビットではなく16ビットを使用するため、十分な小さな数値を処理する場合はshortを使用することが考えられます。

1

通常、プロセッサのワードサイズと一致する番号を使用すると、一致しない番号よりも比較的高速です。一方、shortでは、intよりもメモリ空間が少なくなります。 メモリスペースが限られている場合は、shortを使用する方法があります。個人的には、私はC#アプリケーションを書くときにこのようなことに遭遇したことはありません。

0

intは32ビットのメモリを使用し、shortは16ビットを使用し、byteは8ビットを使用します。 20/30のオブジェクトをループしているだけで、メモリ使用量が気になる場合は、代わりにbyteを使用してください。

intを使用しているところでは、今日のマシンではこのレベルのメモリ使用量はめったに必要ありません。個人的には、私は常に最小のメモリを使用する関連するタイプを使用しようとします。

http://msdn.microsoft.com/en-us/library/5bdb6693(v=vs.100).aspx

関連する問題