2

假设我想存储(整数)x/y 值,这被认为更有效:将其存储在一个原始值中,如 long(非常适合,由于 sizeof(long) = 2*sizeof(int))使用 bit-像移位、掩码或创建点类这样的操作?

请记住,我想创建和存储许多(!)这些点(循环)。使用类时会有性能问题吗?我更喜欢存储在原始数据中而不是存储在类中的唯一原因是垃圾收集器。我猜在循环中生成新对象会过多地触发 gc,对吗?

4

1 回答 1

4

当然,将它们打包long[]会占用更少的内存(尽管它将是连续的)。对于每个 Object (a Point),您将至少12 bytes为两个标题支付更多费用。

另一方面,如果您在循环中创建它们,因此逃逸分析可以证明它们没有逃逸,它可以应用一种称为“标量替换”的优化(认为它非常脆弱);您的对象根本不会被分配。相反,这些对象将被“脱糖”到字段中。

一般规则是您应该以最容易维护和阅读该代码的方式编写代码。当且仅当您看到性能问题(比如说通过分析器或过多的暂停)时,您才应该查看 GC 日志并可能优化代码。

作为附录,jdk 代码本身充满了这样的long东西,其中每一位都意味着不同的东西——所以他们确实打包了它们。但是,我和我怀疑你,是jdk开发人员。我们来说,这些事情很重要——我有严重的怀疑。

于 2021-05-21T16:30:51.537 回答