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