猿问

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

我注意到我总是使用int并加倍,无论数字的大小是多少。因此,在Java中,使用byteshort代替intfloat代替会更有效double吗?

因此,假设我有一个包含很多int和double的程序。如果我知道这个数字合适,是否值得将我的int更改为字节或短裤?

我知道Java没有无符号类型,但是如果我知道数字只会是正数,我还能做些额外的事情吗?

高效,我主要是指处理。我认为,如果所有变量的大小都减半,那么垃圾收集器的速度将大大提高,并且计算速度也可能会更快。(我想因为我在android上工作,所以我也需要担心ram)

(我假设垃圾收集器仅处理对象而不处理原始对象,但仍然删除废弃对象中的所有原始对象,对吗?)

我用一个小型的Android应用程序进行了尝试,但实际上并没有发现任何区别。(尽管我没有“科学地”测量任何东西。)

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

当我开始一个新项目时,从一开始就值得做吗?(我的意思是,我认为一点点都会有所帮助,但是如果有的话,那么又是为什么,似乎没有人会这样做。)


慕尼黑5688855
浏览 510回答 3
3回答

www说

我以为它应该更快,更有效吗?我不愿经历并在大型程序中更改所有内容,以发现自己浪费了时间。简短答案是的,你错了。在大多数情况下,所用空间几乎没有什么不同。这是不值得尝试优化这个......除非你有明确的证据表明需要优化。而且,如果确实需要优化对象字段的内存使用,则可能需要采取其他(更有效的)措施。更长的答案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作为优化的另一个问题。在算术和计算密集的算法中,这可能会使性能变差。
随时随地看视频慕课网APP

相关分类

Java
我要回答