2

我有一个数组,例如(在 Java 中)

int[] a = new int[N];

我已经使用它,现在想要有零数组。什么会花费更少的时间:创建一个新数组(它将被初始化为零)或遍历现有数组并用零填充?

我想无论答案是什么,在 C++ 中都是一样的吗?

4

4 回答 4

5

与创建新数组相比,填充现有数组可能会更好。相对而言,内存分配可能非常昂贵。实际上,如果您最喜欢的语言为您提供了保证清零的新数组,那么它可能会在幕后为您填充它们。

也就是说,这种类型的选择是一种微优化。在大多数情况下,它不会产生任何明显的差异。而且,如果您发现自己处于认为它可能会产生重要影响的特定情况下,那么您最好询问分析器而不是询问 StackOverflow。

编辑我将再添加一个警告:特别是在像 Java 这样的垃圾收集语言中,如果可以干净地完成重用,则最好重用现有对象而不是创建新对象。作为一般经验法则。

重新编辑...除非所讨论的对象预计寿命很短。可能还有一些额外的警告。所以回到“询问分析器”。

于 2012-06-21T00:16:35.813 回答
1

当创建一个新数组并用零实例化它时,它应该更慢。在这种情况下,初始化和迭代完成。在使用现有数组的情况下,只完成迭代位。因此,使用现有数组并对其进行迭代应该更快。当然,我们这里说的是ms,一个新Array的初始化一般不会花很长时间。

于 2012-06-21T00:17:05.027 回答
1

这是一个以 Java 为中心的答案,因为我没有 C++ 经验。

它可能会有所不同,具体取决于您选择的方法。根据 Joshua Bloch 的Effective Java

最好“ ......更喜欢原语而不是装箱的原语,并注意无意的自动装箱”。

这意味着一个数组分配为

int[] array = new int[1000];

将具有更小的内存占用并且创建速度比

Integer[] array = new Integer[1000];

由于不需要对对象int内的值进行自动装箱。Integer

另外,请记住,构造函数很少做显式工作的小对象的创建和回收成本很低,尤其是在现代 JVM 实现上

简而言之,这真的没关系。如果您对测试进行基准测试,如果差异超过几微秒,我会感到惊讶。

于 2012-06-21T00:24:33.090 回答
0

我已经测试过了。

public class Test{
  public static void main(String[] args)
 {
    int[] b = new int[1000000];
    for(int i = 0; i < b.length; i++)
        b[i] = i;

    long t1 = System.currentTimeMillis();
    int[] a = new int[1000000];
    long t2 = System.currentTimeMillis();
    System.out.println("Time to alloc: " + (double) (t2 - t1) / 1000);

    long t3 = System.currentTimeMillis();
    for(int i = 0; i < b.length; i++)
        b[i] = 0;
    long t4 = System.currentTimeMillis();
    System.out.println("Time to iterate: " + (double) (t4 - t3) / 1000);

 }
}
/*output
Time to alloc: 0.004
Time to iterate: 0.001
*/  

所以我们的迭代速度比分配新快大约 4 倍。

于 2012-06-21T00:34:32.607 回答