【问题标题】:toArray with pre sized arraytoArray 与预先确定的数组
【发布时间】:2019-04-16 11:24:59
【问题描述】:

当使用ar.toArray(new String[ar.size()])Android studio 3.2.1 警告预先设定的数组并建议使用空数组

将集合转换为数组有两种样式:使用 预先确定大小的数组(如 c.toArray(new String[c.size()]))或使用 空数组(如 c.toArray(new String[0])。在较旧的 Java 版本中 建议使用预先确定大小的数组,因为反射调用是 创建适当大小的数组所必需的速度非常慢。然而 由于 OpenJDK 6 的更新较晚,因此该调用被内化,使得 空数组版本的性能相同,有时甚至 更好,与预先调整大小的版本相比。也通过了预尺寸 数组对于并发或同步集合是危险的 size 和 toArray 调用之间可能存在数据竞争,这可能 如果集合是 在操作过程中同时收缩。这种检查允许 遵循统一风格:要么使用空数组(即 在现代 Java 中推荐)或使用预先确定大小的数组(可能是 在较旧的 Java 版本或非基于 HotSpot 的 JVM 中速度更快)。

Android 是这样还是只适用于 java?

使用预先确定大小的数组(在旧 Java 版本中可能会更快) 或非基于 HotSpot 的 JVM)。

因为我认为 Android 不是 HotSpot,所以它的虚拟机是 Dalvik,现在是 ART

【问题讨论】:

    标签: java android arrays virtual-machine dalvik


    【解决方案1】:

    好问题。

    https://shipilev.net/blog/2016/arrays-wisdom-ancients/#_new_reflective_array

    底线toArray(new T[0]) 似乎更快、更安全且符合合同要求 更清洁,因此现在应该是默认选择。未来虚拟机 优化可能会缩小toArray(new T[size]) 的性能差距, 使当前的“被认为是最佳的”用法与 实际上是最优的。 Further improvements in toArray API 将 遵循与toArray(new T[0])相同的逻辑 — 集合本身 应该创建适当的存储。

    【讨论】:

      【解决方案2】:

      它读取 since late updates of OpenJDK 6 并且使用哪个运行时来运行它并不重要 - 因为在 Dalvik 上作为编译类运行的代码的语言级别可能是 Java 6、7、8。它只关心项目用于编译它的语言级别。例如:

      compileOptions {
          sourceCompatibility JavaVersion.VERSION_1_8
          targetCompatibility JavaVersion.VERSION_1_8
      }
      

      设置JavaVersion.VERSION_1_6 甚至可能禁用检查投诉...修复这些过时设备上的性能问题可能不值得付出努力 - 一些/大部分甚至可能不会受到影响,因为只有“早期更新”表现不同比所有后续。

      【讨论】:

        【解决方案3】:

        我不是 Java 历史学家,但是...

        HotSpot 似乎本质上是一种由 Oracle 维护和分发的特定类型 JVM 的品牌名称。它的名字来源于即时编译器,它可以检测频繁执行代码的“热点”并即时优化它们。

        Android 运行时也具有这种 JIT 编译器行为,以及在安装时将 java 字节码提前编译为本机机器码。

        这让我认为 ART 与 HotSpot 属于同一类别(就本次检查而言),因此您应该使用本次调用的“空数组”版本。


        如有疑问,请测量!

        确定的最佳方法是编写一个测试程序,执行该方法的两个版本并测量哪个版本运行得更快。


        来源:

        【讨论】:

          猜你喜欢
          • 2015-08-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-23
          • 2012-04-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多