【问题标题】:Array performance and how to get performance of independent variables数组性能以及如何获得自变量的性能
【发布时间】:2017-11-20 08:52:52
【问题描述】:

我正在写一个Java项目,它使用了一个自定义对象——smallObject,它主要由double变量组成。

现在随着项目的发展,我要求 smallObject 中的每个变量都变成一个由 4 个元素组成的数组 - 所以什么是 double 变量,变成了一个 double 类型的数组,有 4 个元素 - bigObject。

使用bigObject的进程和smallObject一模一样,唯一不同的是它们包含一个元素编号,所以smallObject.a = 4,变成bigObject.a[2] = 4;

我期待由于每次访问数组时,我都会准确定义我需要的元素(不必搜索它),性能应该大致相同,但是,性能会降低一个因素2-3。这些对象用于数组列表和队列,最多可包含 300 万个元素。

是否可以预期性能会降低?我该如何解决这个问题?正在考虑使用单个变量(a[4],变为 a1、a2、a3、a4)——但这需要我有不同的类,以便每个类都可以访问正确的变量并使代码不可读。

感谢您的宝贵时间。

【问题讨论】:

  • 数组访问总是涉及边界检查,这会增加可能变得显着的性能损失。
  • 代码 sn-p 可以帮助解答。
  • 您可能会受到边界检查和(可能更多)不良数据局部性的影响。用单个变量替换数组可能会有所帮助,但有更简单的方法。我们首先需要一些代码...

标签: java arrays performance


【解决方案1】:

据我所知,如果你使用基于列表的对象来查找位置 4 的元素,你必须从 1 到 4,因为列表是基于指针 (O(n) 其中 n 是元素的数量如果您习惯于大 O 表示法,则为数组)。如果您使用更简单的元素,例如真正的双精度数组,访问元素 4 应该在 1 次操作 O(1) 中完成...所以尝试使用双精度 []。
希望这对您有所帮助。
亚历克斯

【讨论】:

  • 只有 LinkedListO(n) 访问权限,并且 OP 已经在使用数组。答案是错误的,完全没有抓住问题的重点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-19
  • 2015-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多