java - 在java中,使用byte或short而不是int和float而不是double更有效吗?

标签 java performance int double primitive-types

我注意到我总是使用 int 和 doubles,无论数字需要多大或多小。那么在java中,使用byte是否更高效?或 short而不是 intfloat而不是 double ?

所以假设我有一个包含大量整数和 double 的程序。如果我知道这个数字合适,是否值得将我的整数更改为字节或短裤?

我知道 java 没有无符号类型,但如果我知道这个数字只是正数,我还能做些什么吗?

我所说的高效主要是指处理。我假设如果所有变量都是一半大小,那么垃圾收集器会快得多,并且计算也可能会更快一些。 (我想因为我正在使用 android,所以我也需要有点担心 ram)

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

我用我拥有的一个小型 android 应用程序进行了尝试,但并没有真正注意到有什么不同。 (虽然我没有“科学地”测量任何东西。)

我认为它应该更快更高效是不是错了?我不想经历并改变一个庞大的程序中的所有内容,以发现我浪费了我的时间。

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

最佳答案

Am I wrong in assuming it should be faster and more efficient? I'd hate to go through and change everything in a massive program to find out I wasted my time.

简答

是的,你错了。在大多数情况下,它在使用的空间方面差别不大

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

更长的答案

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

这有两个异常(exception):

  • longdouble 值需要 2 个原始 32 位单元
  • 原始类型数组以打包形式表示,因此(例如)字节数组每个 32 位字包含 4 个字节。

因此 可能 值得优化 longdouble ...以及大型基元数组的使用。但一般不会。

理论上,JIT 可能能够优化这一点,但实际上我从未听说过有这样的 JIT。一个障碍是 JIT 通常在创建正在编译的类的实例之后才能运行。如果 JIT 优化了内存布局,你可以有两个(或更多)同一个类的对象“风格”......这将带来巨大的困难。


重温

查看@meriton 答案中的基准测试结果,似乎使用 shortbyte 而不是 int 会导致乘法性能下降.事实上,如果你孤立地考虑这些操作,惩罚是巨大的。 (你不应该孤立地考虑它们......但这是另一个话题。)

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

无论如何,这确实指向另一个问题,即切换到 shortbyte 作为优化。它可能会使性能更差 ...在算术和计算密集型算法中。


次要问题

I know java doesn't have unsigned types but is there anything extra I could do if I knew the number would be positive only?

没有。无论如何,不​​是在性能方面。 (在 IntegerLong 等中有一些方法可以将 intlong 等作为无符号处理。但这些并没有带来任何性能优势。这不是他们的目的。)

(I'd assume the garbage collector only deals with Objects and not primitive but still deletes all the primitives in abandoned objects right? )

正确。对象的字段是对象的一部分。当对象被垃圾收集时,它就会消失。同样,当收集阵列时,阵列的单元格就会消失。当字段或单元格类型是原始类型时,值将存储在字段/单元格中......它是对象/数组的一部分......并且已被删除。

关于java - 在java中,使用byte或short而不是int和float而不是double更有效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14531235/

相关文章:

java - 如果将clone()值设置为零,则原始对象值也会更改为零

javascript - 如何检测由贝塞尔曲线制成的物体与圆之间的碰撞?

java - for 循环中的 index*int 如何以零结束?

python - 索引值为字符串的切片列表?

java - 没有 minDistance 的 Android requestLocationUpdates

java - jsp:useBean 未从 bean 对象获取属性值

java - 确定字符串是否只包含允许值的最快方法?

javascript - Internet Explorer 可能运行缓慢 : change of logic to be done

SQL 查询在 Symfony 中非常慢,但在 PhpMyAdmin 中非常快

c - 是什么导致了这些默认数组值?