2015-09-23 28 views
6

我正在编写一个性能相当关键的应用程序。对于哪个是x64 CPU的最高效数据类型,我有点困惑。高效代码:VB.Net中的短整型数据类型

MDSN说"In some cases, the common language runtime can pack your Short variables closely together and save memory consumption."而且还"The Integer data type provides optimal performance on a 32-bit processor"

我使用一个庞大的数据量(平均值在交错数组[10或更多] [30] [128128]约500万倍的值),以生成位图实时(数据值的热图)。所有的数据点都是200到3500之间的整数,所以我可以使用short或integer。哪个效率最高?

谢谢。

+2

什么意思是“巨大的”?你有可能用整数得到'OutOfMemoryException'吗?否则,使用整数,一个CPU被设计成可以有效地使用32位值。 –

+0

锯齿阵列平均128 * 128 * 30 * 10数据值(4915200)。内存使用情况良好,我的机器上大约有230 MB,这是该公司的平均规格。我问的原因是因为我正在对图像进行实时处理(改变色调等),所以我需要它尽可能高效。 – Absinthe

+0

如果您希望原始数据的内存占用量更小,请使用short。如果想要更快速地渲染图像,另一种数据类型可能是正确的选择,但没有代码可以检查这些数据是如何使用的。 – dbasnett

回答

0

作为一般规则,变量使用的内存越少,处理速度就越快,并且您将拥有更好的内存管理,因为您的应用程序将使用更少的内存量。

短只需要内存整数需求的一半,如果你只需要一个16位的数字,你肯定它不会更大,使用短。

+1

感谢您的回复。谁会对此评价很好,以解释原因。 – Absinthe

1

对于常规变量,Int32类型是最有效的,例如32位和64位应用程序中的循环计数器。

当您处理大型数据阵列时,读取/写入单个值的效率并不重要,重要的是访问数据,以便尽可能少地使用存储器缓存未命中。与访问缓存内存相比,内存缓存未命中非常昂贵。 (另外,页面错误(内存交换到磁盘)与内存高速缓存未命中相比非常昂贵。)

为避免发生高速缓存未命中错误,您可以将数据存储为尽可能紧凑,并且在处理数据时,您可以访问它尽可能线性化,以便您访问的内存区域尽可能小。

使用Int16对于任何足以跨越多个高速缓存块的阵列而言,最有可能比Int32效率更高,并且高速缓存块通常只有几千字节。

由于您的值可能只存储在12位,所以将每个值存储在1.5个字节的事件甚至更有效,尽管这意味着需要更多的处理来处理数据。数据大小减少25%可能会超过额外的处理。

+0

感谢您的回复。我对数组的每个维度使用一个循环(步进1)来迭代元素,所以我认为这会导致相当线性的访问。您能否澄清一下“将每个值存储在1.5个字节中可能更有效率” - 您将如何执行此操作?鉴于各种各样的答案,我认为最好是对每个选项进行道路测试:) – Absinthe

+0

@Absinthe:由于显然不存在1.5字节的数据类型,因此您可以将值存储在两个字节的一部分中,或者将数值存储在较大的数据中类型。您可以将12位值“a”和“b”存储为三个字节:“aaaaaaaa aaaabbbb bbbbbbbb”。你也可以在四个未使用位的Int64(8字节)中存储五个值(60位)。要从'Int64'数组中读取一个12位的值,你可以使用'(arr [i/5] >>((i%5)* 12))&0xFFF'。 – Guffa