我有一个数组,例如(在Java中)
int[] a = new int[N];
我已经使用它,现在希望有零的数组。 什么花费更少的时间:创建一个新数组(它将被初始化为零)或迭代现有数组并用零填充它?
我想无论答案是什么,它在C ++中都是一样的?
答案 0 :(得分:5)
有可能你最好填充一个现有的阵列,而不是创建一个新阵列。相对而言,内存分配可能非常昂贵。实际上,如果您最喜欢的语言为您提供了保证被清零的新阵列,那么它可能会为您填补它们。
也就是说,这种选择是微观优化。在大多数情况下,它不会产生任何明显的差异。如果你发现自己处于一个特定的情况,你认为它可能会产生重大影响,那么问问分析器要比问StackOverflow要好得多。
编辑我还要再补充一点:特别是在垃圾收集语言(如Java)中,如果可以干净地重复使用,那么最好重新使用现有对象而不是创建新对象。一般的经验法则。
Reedit ...除非有问题的对象预计会非常短暂。可能还有一些额外的警告。然后回到“询问剖析器。”
答案 1 :(得分:1)
创建新数组并使用零实例化时,它应该更慢。在这种情况下,完成初始化和迭代。在使用现有数组的情况下,仅完成迭代位。因此,使用现有数组并迭代它应该更快。当然,我们在这里谈到ms,新数组的初始化通常不需要很长时间。
答案 2 :(得分:1)
这是一个以Java为中心的答案,因为我没有C ++经验。
根据您选择的方法,它可能会有所不同。根据Joshua Bloch的 Effective Java :
最好“ ...更喜欢基元到盒装基元并注意无意识的自动装箱”。
这意味着分配为
的数组int[] array = new int[1000];
将具有更小的内存占用空间并且创建速度比
更快Integer[] array = new Integer[1000];
由于不需要在int
个对象中自动装箱Integer
值。
另外,请记住创建和回收构造函数几乎没有明确工作的小对象,这种方法很便宜,尤其是在现代JVM实现方面。
简而言之,这无关紧要。如果您对测试进行基准测试,如果差异超过几微秒,我会感到惊讶。
答案 3 :(得分: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倍。