[英]Java: is it faster to create new array or set all elements of current array to 0
在我的代码的性能关键部分,我需要通过将它设置回全 0 来清除一个 int 数组buffer
。
我应该做buffer = new int[size]
还是Arrays.fill(buffer, 0)
? 在我的测试中,第一个似乎更快,但由于垃圾收集,它最终可能会变慢。 我对自己的测试没有信心(因为编译器优化之类的东西),所以我在这里问它。
如果重要的话, buffer
的大小约为 300,当它填满时我需要清除buffer
,所以在我的主循环 300 次迭代之后。
我读了更有效地创建新数组或重置数组,但它并没有特别说明更大的 arrays。 它也适用于对象,而不是整数,我认为这很重要。
创建新数组或将当前数组的所有元素设置为 0 是否更快。
没有简单的答案。 JVM 可以更快地分配默认初始化数组,而fill(array, 0)
可以填充相同大小的数组。 但另一方面是难以量化的与 GC 相关的开销:
GC 成本通常与可访问数据量成正比。 对于不可到达的对象,代价本质上是归零 memory 的代价。
GC 成本/效率将取决于堆大小和堆满程度。
GC 开销还取决于对象的生命周期。 例如,长期存在的 object 通常会被“老”代使用,而 GC 的频率会降低。 但另一方面是写屏障可能会使数组写入速度变慢。
不同的 GC 执行不同。
不同的 Java JIT 编译器等执行不同。
等等。
最重要的是,在不知道的情况下不可能给出明确的答案......比您可以提供的更多信息来创建有效的 model 行为。
同样,人为基准可能涉及对上述各种(显性和隐藏)变量做出明确或隐含的选择。 结果很可能是基准测试结果不能反映您的应用程序的实际性能。
所以最好的答案是在您的实际应用程序的上下文中测量和比较性能。 换句话说:
(您的问题有过早优化的味道。您应该能够推迟决定哪些替代方案更好......直到您拥有做出有根据的决定的工具。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.