繁体   English   中英

Java:创建新数组或将当前数组的所有元素设置为0是否更快

[英]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 行为。

同样,人为基准可能涉及对上述各种(显性和隐藏)变量做出明确或隐含的选择。 结果很可能是基准测试结果不能反映您的应用程序的实际性能。

所以最好的答案是在您的实际应用程序的上下文中测量和比较性能。 换句话说:

  1. 让您的应用程序正常工作
  2. 使用真实的测试数据/输入编写一个基准来衡量您的应用程序的性能
  3. 使用基准比较您的应用程序上下文中两种备选方案的性能。

(您的问题有过早优化的味道。您应该能够推迟决定哪些替代方案更好......直到您拥有做出有根据的决定的工具。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM