【问题标题】:performance of byte vs. int in .NET.NET 中字节与 int 的性能
【发布时间】:2009-06-19 14:25:58
【问题描述】:

在 .NET 之前的世界中,我一直认为 int 比 byte 快,因为这是处理器的工作方式。

现在,即使字节可以工作,使用 int 也很重要,例如当 byte 是存储在数据库中的内容时

问题:从性能/内存的角度来看,.NET 如何处理字节类型与 int。

更新: 感谢您的输入。不幸的是,没有人真正回答这个问题。 .NET 如何处理字节与整数。

如果性能没有差异,那么我喜欢chills42 的说法: int 用于算术 二进制字节 我将继续这样做。

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    您在 .NET 之前的假设是错误的 - 周围一直有很多计算机系统,虽然名义上是“字节可寻址”,但必须通过读取一个完整的字来设置单个字节,将其屏蔽以改变它的一个字节,把它全部写下来——比仅仅设置一个完整的单词要慢。这取决于处理器和内存连接方式的内部结构,而不是程序员可见的架构。

    无论是在 .NET 还是本机代码中,首先关注的是使用数据在语义上对您的应用程序是正确的,而不是试图双重猜测计算机系统的架构师——“过早的优化是编程中万恶之源”,引用 Knuth 引用 Hoare 的话。

    【讨论】:

    • 引用很棒,诀窍是定义“过早”。虽然我同意 byte 不一定按字面意思转换为读取字节或以受限的方式使用处理器寄存器。这种“掩饰”不是有代价的吗?
    • @Maxim,当然它“是有代价的”——自从 IBM 引入架构的概念 (机器语言程序员所看到的)与几乎 50 年前的 IBM 360 系列完全区别于实际硬件。如果您正在为任何半流行的架构进行编码(x86 是最糟糕的,因为它拥有迄今为止最多、最分歧的实现),您只是不知道阅读成本有多大1 个字节与 1 个全字是。所以,不用担心,而是使用简单明了的代码。
    • 所以如果我使用 int(32 位),那么它在 64 位机器(Android 和 PC)上的运行速度会比 __int64 慢?
    • 如果 int (32) 在 64 位机器上运行速度较慢,那么 byte & int 在 64 位机器上的性能会完全一样吗? (但在这种情况下,字节对于数组存储会更好吗?)
    【解决方案2】:

    您是在谈论存储空间还是对字节的操作?如果是存储空间,是的,它占用的空间比 int 少(1 字节 vs 4 字节)。

    就字节的算术运算而言,我没有原始数字,实际上只有分析器才能将它们提供给您。但是,您应该考虑到算术运算不是在原始字节实例上完成的。相反,它们被提升为 int,然后在 int 上完成操作。这就是为什么您必须显式转换如下操作的原因

    byte b1 = 4;
    byte b2 = 6;
    byte b3 = b1 + b2;  // Does not compile because the type is int
    

    所以在一般情况下,我认为可以肯定地说对 int 的算术运算比对字节的运算要快。仅仅因为在字节的情况下,您支付(可能非常小的)类型提升成本。

    【讨论】:

      【解决方案3】:

      好的,我刚刚打开了反汇编窗口。除了常规的“mov byte”之外什么都没有

      因此,.NET/CLR 不会为此添加任何内容。并且所有算术运算都是针对 int 值进行的,所以 bytes 和 int 之间没有区别。

      【讨论】:

        【解决方案4】:

        除非您已完成设计并需要找到优化的巧妙方法,否则只需使用您需要的。

        如果您需要一个计数器或正在做基本的数学运算,这可能就是您想要的,如果您正在处理二进制数据,请使用一个字节。

        最后,每种类型都应针对其预期目的进行优化,因此最好将时间花在设计上而不是优化上。

        【讨论】:

          【解决方案5】:

          与任何其他平台相同。为什么 .NET 会改变这一点?代码仍然必须在同一个 CPU 上运行,这与以往具有相同的性能特征。

          这意味着你应该仍然默认使用int。

          【讨论】:

            猜你喜欢
            • 2011-02-22
            • 1970-01-01
            • 2014-08-27
            • 1970-01-01
            • 1970-01-01
            • 2013-03-21
            • 2013-12-31
            • 2011-12-14
            • 1970-01-01
            相关资源
            最近更新 更多