我应该使用byte还是int?

时间:2010-02-27 05:54:40

标签: c# asp.net

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

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

int dayOfWeek;

byte dayOfWeek;

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

6 个答案:

答案 0 :(得分:18)

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

答案 1 :(得分:12)

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

DayOfWeek day = DayOfWeek.Friday;

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

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

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 毫无意义

答案 2 :(得分:4)

我的默认位置是尝试使用强类型向值添加约束 - 您事先知道这些值。因此,在您的示例中,最好使用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. ...但是抵消了极端的性能需求和简单性,特别是在没有涉及长期存储的情况下,或者我们正在考虑查找(低行数)表而不是事务性(高行数)表。< / LI>

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

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

答案 3 :(得分:2)

<击>     System.DayOfWeek

<击>

MSDN

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

答案 4 :(得分:2)

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

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

答案 5 :(得分:2)

就存储空间而言,使用byte并根据cpu性能,使用int

相关问题