使用Int64普遍代替int(C#)的缺点

3
我们使用一个基础实体,其中包含版本(NHibernate需要的日期时间)和GUID(作为键)等属性。
它还具有一个Id(int)字段,具有两个功能。首先,与旧应用程序密钥相关联(如果有)。其次,作为速记代码:例如,有时会基于这些创建文件,如果使用我们的GUID键,看起来会很丑陋和冗长。我的问题不是关于基本实体的利弊,而是将此Id升级到Int64?
这不会影响它在MS SQL Server数据库中的存储方式。它在缓存和内存中的成本会更高吗?这真的那么令人担忧吗?
我想听听除性能以外的其他缺点。还要考虑这些值可能随着时间向第三方通过Web服务公开。
另一种选择是处理较大整数的异常,并在派生实体中特别实现它们。缺点是这需要在代码中完成,当我们在生产中发现某些情况时该怎么办呢?当然会有输入验证来防止实际错误,但它可能会限制扩展数据。
4个回答

4
如果您的应用程序运行在64位CPU上,那么可能没有太大的区别。在32位CPU上,使用64位整数进行计算将更加耗费处理器资源。显然还有内存使用的问题。

3

int64使用8字节的内存存储,而int使用4字节...但是,你已经指出了大部分缺点。当然,在许多系统上执行的计算速度也会更慢(在64位模式下运行的64位系统可以像32位系统一样快地执行64位操作,但32位系统需要执行额外的工作,这意味着将两个64位数字相加需要执行两个32位相加以及一些额外的代码 - 其他数学运算将同样被分解为32位操作)。但是,除非您存储了数百万个这些数字并对它们执行了大量操作,否则我怀疑您将看到任何性能差异,无论是在CPU时间还是内存方面。


2

只有您能回答缓存空间的重要性问题。如果那是缓存键,而您有一些巨大的二进制数据作为值,则在键中添加额外的4个字节不会产生太大影响。但如果您仅存储ID,则显然它将具有更大的比例影响。

目前存储ID所花费的内存有多少?


它介于两者之间,我们尽量保持缓存对象的精简,绝对不会有大块数据。我同意你的成本观点,并在下面评论集成。你还能想到其他慈善事项吗? - dove

1

可移植性...虽然如果你想要可移植性,C#并不是真正被称为通用语言,所以这可能对你的观点无关。


1
可移植性问题会出现在哪里?我并不是说没有这个问题,只是困惑于它可能出现在哪里。我很难想到一个常见的平台没有64位整数类型。 - Jon Skeet
如果所有平台都基于公共语言规范实现其类型,那么我认为这不应该是问题。或者我错了吗? - lowglider
可移植性不仅仅局限于CLR,据说还有其他平台哦;) - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接