C# NET中字节与int的性能

C# NET中字节与int的性能,c#,.net,C#,.net,在.NET之前的世界里,我总是假设int比byte快,因为处理器就是这样工作的 现在,使用int的习惯很重要,即使字节可以工作,例如当字节是存储在数据库中的内容时 问:从性能/内存的角度来看,.NET如何处理字节类型和int类型 更新: 谢谢你的意见。不幸的是,没有人真正回答这个问题。NET如何处理字节与int 如果性能没有差异,那么我喜欢chills42的说法: 算术整数 二进制字节 我将继续这样做。与任何其他平台一样。为什么.NET会改变这一点?代码仍然必须在同一个CPU上运行,这与往常一样

在.NET之前的世界里,我总是假设int比byte快,因为处理器就是这样工作的

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

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

更新: 谢谢你的意见。不幸的是,没有人真正回答这个问题。NET如何处理字节与int

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

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


这意味着默认情况下你仍然应该使用
int

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


无论是在.NET还是本机代码中,首先要将重点放在对应用程序使用语义正确的数据上,而不是试图双重猜测计算机系统的架构——“过早优化是编程中所有邪恶的根源”,引用Knuth quoting Hoare的话。

你是在谈论存储空间还是字节操作吗?如果它是存储空间,那么它占用的空间比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的算术运算比对字节的算术运算快。仅仅是因为在字节的情况下,您需要支付(可能非常小的)类型升级成本

除非你已经完成了你的设计,并且需要找到聪明的方法来优化,否则就使用你需要的

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


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

好的,我刚刚打开了“反汇编”窗口。除了常规的“mov字节”外,没有其他内容


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

引用很好,诀窍是定义“过早”。虽然我同意字节不一定字面上翻译为读取字节或以受限方式使用处理器寄存器。Isnn这种“掩蔽”不是有代价的吗?@Maxim,当然它“有代价的”——自从IBM在将近50年前推出了与实际硬件完全不同的体系结构概念(机器语言程序员所认为的)以来,你不知道自己是否付出了代价。如果您正在为任何半流行的体系结构进行编码(x86是最差的,因为它是迄今为止最流行、最分散的实现),您就不知道读取1字节与1个完整字的成本有多高。所以,甚至不用担心,而是使用简单明了的代码。因此,如果我使用int(32位),那么它在64位机器(Android和PC)上的运行速度将比_uint64慢?如果int(32)在64位机器上运行速度慢,那么字节和int在64位机器上的性能将完全相同?(但在这种情况下,字节对于数组存储会更好?)