3 回答
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作为优化的另一个问题。在算术和计算密集的算法中,这可能会使性能变差。
添加回答
举报