我应该使用byte还是int?

nia*_*her 27 c# asp.net

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

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

int dayOfWeek;
Run Code Online (Sandbox Code Playgroud)

要么

byte dayOfWeek;
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*keP 20

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

  • @niaher"Store"在内存中存储.项目作为字节序列存储在文件中,因此如果您担心磁盘空间,则应使用字节.CPU以32位或64位整数(取决于您的处理器)处理项目,因此任何小于该数量的项目都将"升级"为32位或64位表示以进行运行时计算. (4认同)
  • 是的。或者,如果您正在与需要字节大小的数据位的本机应用程序交互。 (3认同)
  • "商店"是指存储在数据库或文件中? (2认同)
  • 好吧,如果它们位于消耗过多内存的大型数组中,那么使用 byte 而不是 int 仍然是一个不错的选择。 (2认同)

kyo*_*ryu 12

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

DayOfWeek day = DayOfWeek.Friday;
Run Code Online (Sandbox Code Playgroud)

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

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

int z;
int x = 3;
int y = 4;
z = x + y;
Run Code Online (Sandbox Code Playgroud)

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

Gallons z;
Gallons x = new Gallons(3);
Feet y = new Feet(4);
z = x + y;
Run Code Online (Sandbox Code Playgroud)

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

  • 你没听说过*加仑脚*单位吗? (3认同)
  • 是.我相信你用它来衡量*Apple-Kumquats*的体积. (3认同)
  • 同意.误解变量所代表的内容可能比内存或磁盘空间限制所造成的错误更多! (2认同)

Phi*_*hil 5

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

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

  • 实际上,CPU 必须从 RAM 中检索整个缓存行,然后从缓存中检索四字节字,然后是所需的字节 (2认同)

Nij*_*Nij 5

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

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

此开始位置是由长期数据存储的考虑决定的,假设存储空间为“数百万行”-即使它很便宜(在托管和运行SAN或类似产品时便宜很多)。

在另一个数据库示例中,我将使用较小的类型,例如字节(SQL Server tinyint)作为查找ID,我确信不会有太多的查找类型,直到长(SQL Server bigint)用于查找ID的地方。更多记录。即涵盖交易记录。

所以我的经验法则:

  1. 如果可能,请先进行正确性检查。当然,在您的示例中使用DayOfWeek :)
  2. 选择一种合适的大小,从而利用编译器安全检查来尽早给您错误;
  3. ...但是抵消了极端的性能需求和简单性,尤其是在不涉及长期存储的情况下,或者在考虑使用查找(低行数)表而不是事务性(高行数)表的地方。

为了清楚起见,通过将列类型从bigint缩减为较小的类型,数据库存储往往不会像您期望的那样迅速收缩。这既是因为要填充单词边界,又是因为数据库内部存在页面大小问题。但是,您可能会通过将历史记录更改时存储历史记录,并保留备份和日志备份的最后几天来在数据库中多次存储每个数据项。因此,节省百分之几的存储需求将可以长期节省存储成本。

我从没有亲身经历过字节与整数的内存性能问题,但是我却浪费了数小时和数小时的时间来重新分配磁盘空间,并使活动服务器完全停顿,因为没有人可以监视和处理这样的事情。