私は20/30オブジェクトのようにループしているとか、小数点を扱っている他のケースでは、intの代わりにshortを使うのは良い方法ですか?短い使用方法は?
私はなぜこの一般的ではありません意味:それはパフォーマンスゲインが低すぎるため
for(short i=0; i<x; i++)
Method(array[i]);
ですか?
ありがとうございました
私は20/30オブジェクトのようにループしているとか、小数点を扱っている他のケースでは、intの代わりにshortを使うのは良い方法ですか?短い使用方法は?
私はなぜこの一般的ではありません意味:それはパフォーマンスゲインが低すぎるため
for(short i=0; i<x; i++)
Method(array[i]);
ですか?
ありがとうございました
は、 "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
はい、パフォーマンスの差はごくわずかです。しかし、shortはintの場合32ビットではなく16ビットを使用するため、十分な小さな数値を処理する場合はshortを使用することが考えられます。
通常、プロセッサのワードサイズと一致する番号を使用すると、一致しない番号よりも比較的高速です。一方、shortでは、intよりもメモリ空間が少なくなります。 メモリスペースが限られている場合は、shortを使用する方法があります。個人的には、私はC#アプリケーションを書くときにこのようなことに遭遇したことはありません。
int
は32ビットのメモリを使用し、short
は16ビットを使用し、byte
は8ビットを使用します。 20/30のオブジェクトをループしているだけで、メモリ使用量が気になる場合は、代わりにbyte
を使用してください。
int
を使用しているところでは、今日のマシンではこのレベルのメモリ使用量はめったに必要ありません。個人的には、私は常に最小のメモリを使用する関連するタイプを使用しようとします。
http://msdn.microsoft.com/en-us/library/5bdb6693(v=vs.100).aspx
[Int16型VS .NET整数?](http://stackoverflow.com/questions/129023/net-integer-vs-int16)の重複の –
可能重複[Int16型VS .NET整数?]( https://stackoverflow.com/questions/129023/net-integer-vs-int16) – DavidRR