在某些特定情况下,缩小底层类型会带来一些优势,例如与非托管代码接口时与性能相关或强制特定内存布局。
考虑这个样本:
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
}
}
此代码消耗大约 40 KB 的堆。现在指定(取消注释)底层类型byte
并重新编译。哇。突然间,我们只需要大约 10 KB。
像这样压缩内存有时可能会使程序变慢,而不是更快,这取决于特定的访问模式和数据大小。除了进行一些测量并尝试推广到其他可能的情况外,没有办法确定。较小数据的顺序遍历通常更快。
然而,仅仅因为它通常是可能的并且有时是关键的而养成指定窄类型的习惯并不是一个好主意。由于周围更广泛的数据类型的内存对齐,内存节省很少实现。由于需要额外的指令来屏蔽填充字节,因此性能要么相同,要么稍差。
正如另一个答案已经说得很好,跟随Int32
运行时优化的人群,直到您必须开始分析和解决应用程序中的实际内存消耗。