1

我将第一次使用非常少量的非常小的数字(因为每个 int 将在 1 到 10 之间,并且一次有 100 个这样的变量),我想知道是否有任何显着的性能使用 16 位整数与 32 位的区别。我的大多数用户将使用 64 位处理器,但有些用户将使用 32 位。

4

3 回答 3

4

中央处理器

使用单个数字时,使用更紧凑的表示可能会略有改进。那是,

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 的数百万或更多数据点,具体取决于您在做什么),这些优化才会对您的用户真正重要。

于 2012-07-30T21:52:59.303 回答
3

如有疑问,请测量。但除了内存消耗差异之外,我怀疑你会看到任何东西。

于 2012-07-30T21:52:25.850 回答
2

总的来说,这里的答案很好,但是在 .NET 平台上有一个特定的考虑:CIL 中没有 8 位或 16 位算术运算。

这意味着出于算术的目的,所有 8 位和 16 位值都被隐式转换为 32 位。

ECMA 规范 - 第 3 部分 (CIL) - 第 1.6 节隐式参数强制

于 2012-07-30T22:04:14.827 回答