我将第一次使用非常少量的非常小的数字(因为每个 int 将在 1 到 10 之间,并且一次有 100 个这样的变量),我想知道是否有任何显着的性能使用 16 位整数与 32 位的区别。我的大多数用户将使用 64 位处理器,但有些用户将使用 32 位。
3 回答
中央处理器
使用单个数字时,使用更紧凑的表示可能会略有改进。那是,
ushort a;
ushort b;
// @mikez pointed a & b are promoted to int when added
// C# spec, 7.3.6.2 Binary numeric promotions
ushort result = (ushort)(a + b);
可能比
ulong a;
ulong b;
ulong result = a + b;
取决于你的算法。原因是当单个数字较小时,更多的数据可以放入 CPU 缓存中,最终需要从 RAM 传输到 CPU 的数据更少。
另一方面,由于读/写数据未与 64 位地址边界对齐,它可能会稍微慢一些。
这两个因素相互影响。衡量您的用例,从 CPU 的角度了解您的情况是好是坏。
在内存中
使用 aList<ushort>
而不是 aList<ulong>
将节省 75% 的内存成本。 如果这阻止了交换,它将使您的应用程序受益。
在磁盘上
如果您正在保存到数据库,并且如果您的工作集太大而无法容纳数据库引擎可用的 RAM,则使用较小的大小可能会对性能产生巨大影响,因为更多的记录适合较少的磁盘扇区,从而减少了磁盘寻道时间(假设没有 SSD)并增加每单位时间内可以通过 IO 通道传输的数据点数量。
警告
请注意,只有与计算机的处理能力相比,数量确实很大时,所有这些才有意义。如果您有足够的 RAM 将所有数据保存在内存中,则不会交换。如果您的数据库服务器和/或存储控制器缓存可以将您的工作集保存在内存中,那么磁盘存储大小的考虑将无关紧要。
底线
如果您对要处理的值的范围有误,那么使用较小的数据类型只会对您造成伤害,并且您突然需要更大的数据类型来保存所有值。
快速制作关键算法的原型。使用 ushort、uint、ulong 的各种选择执行一些测量。
如果您的“100 个变量”每个都只包含一个数字(而不是一个包含大量数字的列表),那么这些都不重要。只有当您开始对您的计算机施加压力时(可能在 10 到 100 的数百万或更多数据点,具体取决于您在做什么),这些优化才会对您的用户真正重要。
如有疑问,请测量。但除了内存消耗差异之外,我怀疑你会看到任何东西。
总的来说,这里的答案很好,但是在 .NET 平台上有一个特定的考虑:CIL 中没有 8 位或 16 位算术运算。
这意味着出于算术的目的,所有 8 位和 16 位值都被隐式转换为 32 位。
ECMA 规范 - 第 3 部分 (CIL) - 第 1.6 节隐式参数强制