在阅读70-536培训套件时,其指出:
运行时会优化32位整数类型(Int32)的性能,因此将这些类型用于计数器和其他频繁访问的整数变量。
这只适用于32位环境吗?在64位环境中,是否应该使用Int64,还是Int32仍然是更好的选择?
在阅读70-536培训套件时,其指出:
运行时会优化32位整数类型(Int32)的性能,因此将这些类型用于计数器和其他频繁访问的整数变量。
这只适用于32位环境吗?在64位环境中,是否应该使用Int64,还是Int32仍然是更好的选择?
这种说法很有趣。运行时与此无关。
CPU被设计用于处理32位整数,这就是为什么它们是最有效的。
在64位环境中,这又取决于CPU。然而,至少在x86 CPU上(据我所知,这是.NET运行的唯一地方),32位整数仍然是默认值。寄存器只是扩展了,以便可以容纳64位值。但32位仍然是默认值。
所以即使在64位模式下,也要优先选择32位整数。
编辑:“默认”可能不是正确的词。CPU只支持一些指令,这些指令定义了它可以处理哪些数据类型,哪些不能处理。那里没有“默认”值。然而,通常有一个数据大小,CPU被设计为可以高效处理。在x86上,在32位和64位模式下,这是32位整数。64位值通常并不更昂贵,但它们意味着更长的指令。我还相信至少64位Pentium 4在64位操作方面明显较慢,尽管在最近的CPU上,这部分不应该是问题。(但指令大小仍可能是)
小于32位的值有点令人惊讶。是的,传输的数据较少,这很好,但CPU仍然一次抓取32个字节。这意味着它必须屏蔽部分值,因此这些变得更慢。
除非你打算使值超过20亿,否则使用整数值。没有理由为了一种看似的性能优势而使用额外的空间。
与这个主题上其他人所说的相反,除非你衡量了这样一个小事情的好处,否则它只是一种看似的好处。
http://en.wikipedia.org/wiki/64-bit建议(您可能会找到更权威的来源,这是我找到的第一个)微软的“64位”产品使用64位指针和32位整数。
http://www.anandtech.com/guides/viewfaq.aspx?i=112(我不知道它有多可靠)说:
为了将代码膨胀最小化,AMD实际上将默认数据操作数大小设置为64位寻址模式下的32位。动机是64位数据操作数不太可能被需要并且可能会损害性能;在需要64位数据操作数的情况下,可以使用新的REX前缀激活它们(哇呜,又是x86指令前缀 :))。
32位CPU可以更快地处理32位整数。64位CPU可以更快地处理64位整数;想一想——你要么必须一直将位移32位,要么每32位浪费32位,这本质上与使用64位变量而没有64位变量的优势是相同的。另一个选择是在CPU中构建额外的电路,以便不需要进行位移,但显然这会增加生产成本。对于32位CPU处理16位或8位变量也是如此。
我不确定,但我不会感到惊讶,如果.NET Framework的64位版本更优化地使用长整型——但这只是我的猜测。