たとえば、配列があります(Javaで)
int[] a = new int[N];
私はそれを扱ってきましたが、今はゼロの配列が必要です。時間がかからないのは、新しい配列を作成する (ゼロで初期化される) か、既存の配列を繰り返してゼロで埋めることですか?
答えが何であれ、C++ でも同じでしょうか?
たとえば、配列があります(Javaで)
int[] a = new int[N];
私はそれを扱ってきましたが、今はゼロの配列が必要です。時間がかからないのは、新しい配列を作成する (ゼロで初期化される) か、既存の配列を繰り返してゼロで埋めることですか?
答えが何であれ、C++ でも同じでしょうか?
新しい配列を作成するよりも、既存の配列を埋めた方がよい場合があります。メモリの割り当ては、相対的に非常に高価になる可能性があります。実際、あなたのお気に入りの言語が、ゼロで埋められることが保証されている新しい配列を提供している場合、それはおそらくあなたのために隠れてそれらを埋めています.
とはいえ、このタイプの選択はマイクロ最適化です。ほとんどの場合、識別可能な違いはありません。また、重要な違いが生じる可能性があると思われる特定のケースに遭遇した場合は、StackOverflow に尋ねるよりもプロファイラーに尋ねる方がはるかに優れています。
編集もう 1 つ注意点を追加します。特に Java のようなガベージ コレクション言語では、再利用がきれいにできる場合は、新しいオブジェクトを作成するよりも、既存のオブジェクトを再利用する方がよいでしょう。一般的な経験則として。
再編集...問題のオブジェクトの寿命が非常に短いと予想される場合を除きます。おそらくいくつかの追加の注意事項もあります。そして、「プロファイラーに尋ねる」に戻ります。
新しい配列を作成し、それをゼロでインスタンス化すると、遅くなるはずです。この場合、初期化と反復が行われます。既存の配列を使用する場合、反復ビットのみが実行されます。したがって、既存の配列を使用して反復する方が高速です。もちろん、ここでは ms について話します。新しい配列の初期化には、一般に時間がかかりません。
私は C++ の経験がないため、これは Java 中心の回答です。
選択する方法によって異なります。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 倍高速な反復があります。