基になるタイプを絞り込むと、パフォーマンスに関連する、またはアンマネージコードにインターフェイスするときに特定のメモリレイアウトを強制するなど、いくつかの利点がもたらされる特定の状況があります。
このサンプルを検討してください。
using System;
public enum Operations_PerHourType // : byte
{
Holes = 1,
Pieces = 2,
Sheets = 3,
Strips = 4,
Studs = 5
}
class Program
{
static void Main()
{
long before = GC.GetTotalMemory(false);
var enums = new Operations_PerHourType[10000];
long after = GC.GetTotalMemory(false);
Console.WriteLine(after - before);
// output (byte): 12218 (I'm using Mono 2.8)
// output (Int32): 40960
}
}
このコードは、ヒープの約40KBを消費します。次に、基になるタイプをとして指定(コメント解除)してbyte
、再コンパイルします。わお。突然、必要なのは約10KBだけです。
このようにメモリを圧縮すると、特定のアクセスパターンとデータサイズによっては、プログラムが遅くなる場合がありますが、速くなることはありません。いくつかの測定を行い、他の考えられる状況に一般化しようとする以外に、確実に知る方法はありません。通常、小さいデータのシーケンシャルトラバーサルは高速です。
ただし、通常は可能であり、場合によっては重要であるという理由だけで、狭いタイプを指定する習慣を身に付けることはお勧めできません。周囲のより広いデータ型のメモリアライメントのため、メモリの節約が実現することはめったにありません。その場合、パディングバイトをマスクするために必要な追加の命令のために、パフォーマンスは同じかわずかに悪化します。
別の答えがすでにうまくいっているのでInt32
、アプリケーションで実際のメモリの占有のプロファイリングと対処を開始する必要があるまで、ランタイムが最適化されている群衆に従ってください。