【问题标题】:Program speed vs memory usage [duplicate]程序速度与内存使用量[重复]
【发布时间】:2013-05-06 21:46:21
【问题描述】:

我想知道我的程序速度。当我使用像Array.GetLength(1) 这样的方法时,它总是返回int 变量。或者当我插入一个数字时,编译器再次将其声明为int。我是否需要将它们转换为byte 变量以降低内存使用率,否则会影响我的程序速度?

【问题讨论】:

  • 回答这个问题的最简单方法是分析两个差异
  • 最快的尺寸是您的原始尺寸。 32位操作系统?然后是int。 64位操作系统?可以“长”
  • 我认为,最重要的问题是:“你真的需要这种微优化吗?”你不能在 4.77MHz CPU 的 64K 机器上工作
  • 对于方法变量,byteint 不会有任何区别; IL 堆栈操作仅适用于 i8/i4 - i2 和 i1 实现为 i4。如果您有 20,000 个 int 与 20,000 个 byte 的数组,那么 那个 可能是一个值得提出的问题。

标签: c# int byte


【解决方案1】:

就计算机对其执行的算术运算而言,两者都同样快。

但是如果您有大量数据,那么 byte 可以明显更快,这纯粹是因为较小的大小:

  1. 您的 CPU 缓存包含的 byte 对象多于 int 对象。
  2. 使用byte 对象数组的每个元素比int 对象需要更少的内存带宽。如果您必须使用数据库或通过网络发送数据,那么带宽的使用将成为一个真正大问题。
  3. 您的计算机 RAM 可以保存更多的byte 值,然后才开始将硬盘用作虚拟内存。如果您的数据集大小是int 需要虚拟内存而byte 不需要,那么byte 会快很多。

字节唯一真正的缺点是您最终会经常编写代码来与int 进行转换,即使这种转换最终在 CPU 上免费完成(使用字节传输到寄存器而不是字转移)

【讨论】:

    【解决方案2】:

    方法变量在堆栈上(警告:迭代器块、捕获的变量等 - 但不要担心这些)。无论您做什么,堆栈的大小都将相同。如果您在谈论严重超大的值类型,那么明显的担忧将是堆栈耗尽(这可能可以通过ref 缓解,但这与这个问题无关) - 但改变 intbyte 的局部方法变量 不会改变任何东西。实际上,IIRC 的 IL 堆栈操作仅定义为 4 或 8 字节值。

    基本上:这根本没有帮助,所以不用担心。但它也不会甚至远程影响您的应用程序的性能或内存使用情况。如果你想知道是什么,那么就来profile吧。

    【讨论】:

    • 作为说明 - 请参阅 conv.ovf.u1 上的 cmets,这是转换为 byte 的操作码之一(特别是在 checked 上下文中):“转换为无符号 int8(在堆栈为 int32) 并在溢出时引发异常。” - 即使它在逻辑上转换为int8,它立即实际上又是一个int32。这 实际上 所做的就是去掉除了 LSB(检查溢出)之外的所有内容,但将其保留为 int32
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    • 2017-11-27
    • 2011-01-29
    • 1970-01-01
    相关资源
    最近更新 更多