当前位置: 首页 > 面试题库 >

向下转换是否会使短片的性能/内存优势无效?

杨乐
2023-03-14
问题内容

我正在编写一个大型应用程序,试图在其中节省尽可能多的内存并提高性能。因此,当我知道一个字段只会具有0-10或-100-100的值时,我尝试使用short数据类型而不是int

但是,对于其余的代码,这意味着当我调用这些函数时,到处都是,我必须将simple ints转换为shorts。例如:

方法签名

public void coordinates(short x, short y) ...

方法调用

obj.coordinates((short) 1, (short) 2);

这就像遍及我的所有html" target="_blank">代码一样,因为文字被视为ints,并且不会根据函数参数自动向下转换或键入。

这样,一旦发生这种向下转换,性能或内存增益实际上是否有意义?还是转换过程如此高效,以至于我仍然可以获得一些收益?


问题答案:

除了short []和int []之外,在32位平台上使用short和int没有任何性能上的好处-即使这样,缺点通常也超过了优点。

假设您在x64,x86或ARM-32上运行:

  • 使用时,16位SHORT被存储在32位或64位长的整数寄存器中,与int相同。也就是说,使用short时,与int相比,您不会获得任何内存或性能上的好处。
  • 在堆栈上时,16位SHORT存储在32位或64位“插槽”中,以保持堆栈对齐(就像int一样)。对局部变量使用SHORTs与INTs不会获得任何性能或内存优势。
  • 当作为参数传递时,将SHORTs压入堆栈时,它们会自动扩展为32位或64位(与刚刚压入的int不同)。与使用int相比,此处的代码实际上性能稍差,并且(代码)内存占用量稍大。
  • 存储全局(静态)变量时,这些变量会自动扩展为占用32位或64位插槽,以保证指针(引用)的对齐。这意味着对于全局(静态)变量使用SHORTs与INTs不会获得性能或内存方面的好处。
  • 存储字段时,这些字段位于堆内存中的结构中,该结构映射到类的布局。在此类中,字段自动填充为32位或64位,以保持堆上字段的对齐。通过将SHORTs用作字段而不是INT,不会获得性能或内存上的好处。

使用SHORT与INT相比,您看到的 唯一 好处就是分配了它们的数组。在这种情况下, N个 短裤阵列的长度大约是 N个 整数阵列的一半。

除了在大量短裤中存在复杂但局部的数学运算的情况下,将变量同时包含在热循环中而带来的性能优势之外,您再也看不到使用SHORTS与INT的优势。

所有 其他情况下(例如,用于字段,全局变量,参数和局部变量的短裤),除了可以存储的位数之外,SHORT和INT之间 没有 区别。

我的建议一如既往,建议在使代码更难阅读和人为限制之前,尝试对代码进行 标记, 以查看内存和CPU瓶颈在哪里,然后解决这些瓶颈。

我强烈怀疑,如果您遇到应用程序使用整数而不是短裤的情况,那么您早就放弃了Java,以减少内存/ CPU的运行时,因此所有这些工作都需要预先进行浪费了精力。



 类似资料:
  • 问题内容: 在一个字段只有5-10个不同的可能值的情况下使用枚举是否有性能优势?如果不是,优势是什么? 问题答案: 使用以下操作会导致巨大的性能 损失: 查询中的允许值列表,例如,填充一个下拉菜单。您必须从查询数据类型,并从返回的BLOB字段中解析列表。 更改允许值的集合。它需要一条语句,该语句锁定表并可以进行重组。 我不是MySQL的粉丝。我更喜欢使用查找表。另请参阅我对“ 如何在数据库中没有枚

  • 问题内容: 使用迭代器可以提供什么(如果有的话)性能优势。似乎是解决许多问题的“正确方法”,但是它会创建更快/更具有内存意识的代码吗?我在用Python专门思考,但不要仅仅局限于此。 问题答案: 实际上在python邮件列表上有一封很好的邮件: Iterators vs Lists 。这有点过时(从2003年开始),但是据我所知,它仍然有效。 总结如下: 对于小型数据集,基于迭代器和列表的方法具有

  • 问题内容: 数据库引擎如何内部处理varchar列? 对于定义为的列,DBMS在磁盘上分配100个连续字节。但是,对于定义为的列,大概不是这种情况,因为的重点是分配的空间不会超过存储该列中存储的实际数据值所需的空间。因此,当用户将一个包含空列的数据库行更新为一个包含80个字符的值时,那80个字符的空间是从哪里分配的呢? 看来,至少在列值最初以空白或NULL插入,然后以实际值更新的情况下,列必须导致

  • 当无序处理器遇到以下情况时 假设所有访问都将导致缓存未命中,处理器能否在请求$R1甚至0x1337之前请求内存控制器请求0x42的内容?如果是这样,假设访问$R1将导致异常(例如,分段错误),我们可以认为0x42是推测性加载的,对吗? 顺便说一下,当加载存储单元向内存控制器发送请求时,它可以在接收到对前一个的回答之前发送第二个请求吗? 我的问题没有特别针对任何架构。欢迎与任何主流架构相关的答案。

  • 前言 在应用程序运行过程中,如果内存出现了问题,具体有怎样的体现 内存问题的外在表现 1.页面出现延迟加载或经常性暂停(限定网络情况正常) 2.页面持续性出现糟糕的性能(限定网络情况正常) 3.页面的性能随时间延长越来越差(限定网络情况正常) 界定内存问题的标准 1.内存泄漏:内存使用持续走高 2.内存膨胀:在多数设备上都存在性能问题 3.频繁垃圾回收:通过内存变化图进行分析 监控内

  • 问题内容: 我已经搜寻了几天,以找到针对此性能问题的答案。 到目前为止,在深入研究Internet之后,我了解到有几种使用Java中的Enums的方法,在这里有充分的记录。好吧,毫无疑问,作为一个入门者,我们希望在 switch-case 语句中使用Enums ,它可以使代码更清晰并更好地理解代码。但是另一方面,我们也有Enums 的 Visitor模式 样式实现,该实现可确保类型安全和可扩展性