【问题标题】:Efficient code: short vs integer data types in VB.Net高效代码:VB.Net 中的短与整数数据类型
【发布时间】:2015-12-20 13:43:58
【问题描述】:

我正在编写一个性能相当关键的应用程序。对于 x64 CPU 最有效的数据类型,我有点困惑。

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"

我正在使用大量数据(锯齿状数组中的平均大约 500 万个值[10 或更多][30][128,128])实时生成位图(数据值的热图)。所有数据点都是 200 到 3500 之间的整数,所以我可以使用短整数或整数。哪个效率最高?

谢谢。

【问题讨论】:

  • “巨大”是什么意思?您是否有可能获得带有整数的OutOfMemoryException?否则使用整数,CPU 旨在高效处理 32 位值。
  • 锯齿状数组中平均有 128 * 128 * 30 * 10 个数据值 (4915200)。内存使用还可以,我的机器上大约 230 MB,这是公司的平均规格。我问的原因是因为我正在对图像进行实时处理(改变色调等),所以我需要它尽可能高效。
  • 如果您希望原始数据的内存占用更小,请使用 short。如果您想要更快地渲染图像,另一种数据类型可能是正确的选择,但是没有代码可以检查显示数据的使用方式。
  • 感谢您的回复。在这种情况下,我不能准确的邮政编码,因为它对商业敏感,但基本上我从 Excel 中获取 128 x 128 的单元格范围,保持值在 200 - 3500 范围内,并使用一些简单的公式转换为 RGB 值来着色128 x 128 像素位图中的像素,该方法类似于 Excel 中的色阶条件格式。我更关心渲染速度而不是内存占用。
  • 我想知道你怎么可能无法自己找到这个。只需尝试两种方式,使用秒表进行测量。由于实际成本是从 Excel 电子表格中获取如此多的数据,因此它不会产生任何明显的差异。

标签: vb.net performance integer short processing-efficiency


【解决方案1】:

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

Short 只需要内存整数的一半,如果你只需要一个 16 位的数字并且你确定它永远不会更大,请使用 Short。

【讨论】:

  • 感谢您的回复。谁能给这个评分来解释原因会很好。
【解决方案2】:

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

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

为避免缓存未命中,您可以尽可能紧凑地存储数据,并且在处理数据时可以尽可能线性地访问它,从而使您访问的内存区域尽可能小。

对于任何大到足以跨越多个缓存块的数组,使用Int16 最有可能比Int32 更有效,而一个缓存块通常只有几千字节。

由于您的值可以仅存储在 12 位中,因此将每个值存储在 1.5 字节中甚至可能更有效,即使这意味着处理数据需要更多处理。减少 25% 的数据量可能足以弥补额外的处理。

【讨论】:

  • 感谢您的回复。我对数组的每个维度使用一个循环(步骤 1)来迭代元素,所以我假设这会导致相当线性的访问。您能否澄清一下“将每个值存储在 1.5 个字节中可能更有效” - 您将如何做到这一点?鉴于答案的多样性,我认为最好对每个选项进行路试:)
  • @Absinthe:显然没有 1.5 字节的数据类型,您可以将一个值存储在两个字节的一部分中,或者将多个值存储在更大的数据类型中。您可以将 12 位值 ab 存储到三个字节中:aaaaaaaa aaaabbbb bbbbbbbb。您还可以将五个值(60 位)存储在具有四个未使用位的 Int64(8 字节)中。要从 Int64 数组中读取 12 位值,您可以使用 (arr[i / 5] >> ((i % 5) * 12)) & 0xFFF
猜你喜欢
  • 2021-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-12
  • 1970-01-01
  • 1970-01-01
  • 2016-02-06
相关资源
最近更新 更多