我应该使用byte还是int?

我记得在某处读过使用Int32更好(在性能方面),即使你只需要字节。 它(仅限于)适用于您不关心存储的情况。 这有效吗?

例如,我需要一个可以保存一周的变量。 我

int dayOfWeek; 

要么

 byte dayOfWeek; 

编辑 :伙计们,我知道DayOfWeek枚举。 问题是关于其他事情。

通常是的,32位整数的性能稍好一些,因为它已经针对本机CPU指令正确对齐。 当您确实需要存储那么大的东西时,您应该只使用较小尺寸的数字类型。

您应该使用DayOfWeek枚举,除非有充分的理由不这样做。

 DayOfWeek day = DayOfWeek.Friday; 

要解释一下,因为我被投票了:

代码的正确性几乎总是比性能更重要,特别是在我们谈论这个小差异的情况下。 如果使用枚举或表示数据语义的类(无论是DayOfWeek枚举,还是其他枚举,或加仑或英尺类)使您的代码更清晰或更易于维护,它将帮助您达到可以达到的程度安全优化。

 int z; int x = 3; int y = 4; z = x + y; 

那可能会编译。 但是没有办法知道它是否正在做任何有益的事情。

 Gallons z; Gallons x = new Gallons(3); Feet y = new Feet(4); z = x + y; 

这不会编译,甚至看着它显然为什么不 – 将Gallons添加到Feet 是没有意义的

我的默认位置是尝试使用强类型向值添加约束 – 您事先知道这些值。 因此,在您的示例中,最好使用byte dayOfWeek因为它更接近您期望的值范围。

这是我的推理; 以存储和传递日期的年份为例。 年份部分 – 当考虑系统的其他部分包含SQL Server DateTimes时,被限制在1753到9999之间(注意C#的DateTime可能的范围是不同的!)因此,一个short涵盖了我可能的值,如果我试图传递任何更大的值在编译代码之前编译器会发出警告。 不幸的是,在这个特定的例子中,C#DateTime.Year属性将返回一个int – 因此如果我需要将例如DateTime.Now.Year传递给我的函数,则强制我转换结果。

这个起始位置是由长期存储数据的考虑驱动的,假设“数百万行”和磁盘空间 – 即使它很便宜(当你托管和运行SAN或类似的东西时,它便宜得多)。

在另一个数据库示例中,我将使用较小的类型,例如byte(SQL Server tinyint)用于查找ID,其中我确信不会有很多查找类型,直到很长(SQL Server bigint)的id可能存在更多记录。 即覆盖交易记录。

所以我的经验法则是:

  1. 如果可能的话,首先考虑正确性。 在你的例子中使用DayOfWeek,当然:)
  2. 寻找合适大小的类型,从而利用编译器安全检查,尽早给出错误;
  3. …但抵消极端性能需求和简单性,特别是在不涉及长期存储的情况下,或者我们正在考虑查找(低行数)表而不是事务性(高行数)表。

为了清晰起见,通过将列类型从bigint缩小到较小类型,数据库存储不会像预期的那样快速缩小。 这是因为填充到字边界和DB内部的页面大小问题。 但是,您可能会在数据库中多次存储每个数据项,可能是通过在更改时存储历史记录,还可以保留备份和日志备份的最后几天。 因此,节省几个百分点的存储需求可以长期节省存储成本。

我从来没有亲身经历过字节与内联的内存性能问题,但是我浪费了数小时而不得不重新分配磁盘空间并让实时服务器完全停止,因为没有一个人可以监控和管理这样的事情。

System.DayOfWeek

MSDN

大多数时候使用int。 不是表现而是简单。

使用int。 计算机存储器由“字”寻址,通常为4个字节长。 这意味着如果你想从内存中获取一个字节的数据,CPU必须从RAM中检索整个4字节字,然后执行一些额外的步骤来隔离你感兴趣的单字节。关于性能,CPU将更容易检索整个单词并完成它。

实际上,就性能而言,你不会注意到两者之间的任何差异(除了罕见的极端情况)。 这就是为什么我喜欢使用int而不是byte,因为你可以存储更大的数字而几乎没有惩罚。

在存储量,使用byte和cpu性能方面,使用int