为了账号安全,请及时绑定邮箱和手机立即绑定

在Java中,使用byte或short代替int和float代替double效率更高吗?

在Java中,使用byte或short代替int和float代替double效率更高吗?

慕尼黑5688855 2019-12-17 15:15:22
我注意到我总是使用int并加倍,无论数字的大小是多少。因此,在Java中,使用byte或short代替int和float代替会更有效double吗?因此,假设我有一个包含很多int和double的程序。如果我知道这个数字合适,是否值得将我的int更改为字节或短裤?我知道Java没有无符号类型,但是如果我知道数字只会是正数,我还能做些额外的事情吗?高效,我主要是指处理。我认为,如果所有变量的大小都减半,那么垃圾收集器的速度将大大提高,并且计算速度也可能会更快。(我想因为我在android上工作,所以我也需要担心ram)(我假设垃圾收集器仅处理对象而不处理原始对象,但仍然删除废弃对象中的所有原始对象,对吗?)我用一个小型的Android应用程序进行了尝试,但实际上并没有发现任何区别。(尽管我没有“科学地”测量任何东西。)我以为它应该更快,更有效吗?我不愿经历并在大型程序中更改所有内容,以发现自己浪费了时间。当我开始一个新项目时,从一开始就值得做吗?(我的意思是,我认为一点点都会有所帮助,但是如果有的话,那么又是为什么,似乎没有人会这样做。)
查看完整描述

3 回答

?
www说

TA贡献1775条经验 获得超8个赞

我以为它应该更快,更有效吗?我不愿经历并在大型程序中更改所有内容,以发现自己浪费了时间。


简短答案

是的,你错了。在大多数情况下,所用空间几乎没有什么不同。


这是不值得尝试优化这个......除非你有明确的证据表明需要优化。而且,如果确实需要优化对象字段的内存使用,则可能需要采取其他(更有效的)措施。


更长的答案

Java虚拟机使用偏移量(实际上是32位原始单元格大小的倍数)对堆栈和对象字段进行建模。因此,当您将局部变量或对象字段声明为(例如)a时byte,变量/字段将存储在32位单元中,就像a一样int。


有两个例外:


long和double值需要2个原始32位单元

基本类型的数组以打包形式表示,因此(例如)字节数组每个32位字包含4个字节。

因此,可能有必要优化long和double...以及大量原语的使用。但总的来说没有。


从理论上讲,JIT 也许可以优化它,但实际上我从未听说过这样做。一个障碍是,JIT通常无法运行,直到创建了要编译的类的实例之后。如果JIT优化了内存布局,那么您可能会有两个(或更多)相同类的对象的“味道”……这将带来巨大的困难。


重访

查看@meriton答案中的基准测试结果,看来使用short和byte而不是int乘法会导致性能下降。的确,如果孤立地考虑这些操作,那么代价将是巨大的。(您不应该孤立地考虑它们……但这是另一个主题。)


我认为这是因为JIT可能在每种情况下都使用32位乘法指令进行乘法运算。但是在byteand的short情况下,它会执行额外的指令,以在每次循环迭代中将中间的32位值转换为a byte或short。(理论上,该转换可以在循环结束时完成一次,但是我怀疑优化器是否能够解决这一问题。)


无论如何,这确实指出了切换到short并byte作为优化的另一个问题。在算术和计算密集的算法中,这可能会使性能变差。


查看完整回答
反对 回复 2019-12-17
  • 3 回答
  • 0 关注
  • 509 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信