Bah*_*man 13 java arrays android virtual-machine dalvik
使用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 调用之间可能会发生数据竞争,这可能会导致额外的如果集合在操作期间同时收缩,则数组末尾为 null。此检查允许遵循统一样式:使用空数组(现代 Java 中推荐使用)或使用预先确定大小的数组(在较旧的 Java 版本或非基于 HotSpot 的 JVM 中可能更快)。
对于Android还是仅适用于Java?
使用预先确定大小的数组(在较旧的 Java 版本或非基于 HotSpot 的 JVM 中可能更快)。
因为我认为 Android 不是 HotSpot,它的虚拟机是 Dalvik,现在是 ART
很好的问题。
https://shipilev.net/blog/2016/arrays-wisdom-ancients/#_new_reflective_array
底线:
toArray(new T[0])看起来更快、更安全、更清洁,因此现在应该是默认选择。未来的 VM 优化可能会缩小这种性能差距toArray(new T[size]),从而使当前“认为是最佳的”用法与实际最佳的用法相提并论。进一步 的改进中toArray的API将遵循同样的逻辑toArray(new T[0])- ?集合本身应该建立相应的存储。
我不是 Java 历史学家,但是......
HotSpot 本质上似乎是由 Oracle 维护和分发的特定类型 JVM 的品牌名称。它的名字来源于即时编译器,可以检测频繁执行的代码的“热点”并即时优化它们。
Android 运行时也具有这种 JIT 编译器行为,以及在安装时将 java 字节码提前编译为本机机器代码。
这让我认为 ART 与 HotSpot 属于同一类别(就本次检查而言),因此您应该使用此调用的“空数组”版本。
如有疑问,请测量!
确定的最佳方法是编写一个测试程序,执行该方法的两个版本并测量哪个版本运行得更快。
资料来源:
| 归档时间: |
|
| 查看次数: |
3527 次 |
| 最近记录: |