以下のコードを実行すると138 ms53 ms326 ms二つ目は一つ目と同じ配列を使っているのに3倍近く計算時間が速くなってしまいます。三つめは、単に違う配列を使っただけで全く同じコードなのに一つ目よりも3倍近く遅くなってしまいます。デバッグモードではなく、リリースモードを使っていますし、何度か試してみたのですが何度やっても同じような結果になってしまいます。これってなぜなのでしょうか? Dim sw As New Stopwatch Dim Hai(100000000) As Integer sw.Restart() For i = 1 To 100000000 Hai(i) = 1 Next '138 ms MsgBox(sw.ElapsedMilliseconds) sw.Restart() For i = 1 To 100000000 Hai(i) = 2 Next '53 ms MsgBox(sw.ElapsedMilliseconds) Dim Hai2(100000000) As Integer sw.Restart() For i = 1 To 100000000 Hai2(i) = 1 Next '326 ms MsgBox(sw.ElapsedMilliseconds)
■No97921 (山善 さん) に返信 > 仮想記憶だから Dim Hai(100000000) as Integer なんていう巨大な領域が一度に確保できるわけではないからではないかな? この配列を宣言したところで、領域全体が実記憶として割当たるわけでいはない。 For i = 1 to 100000000 Hai(i)=1 Next このループの中で、実記憶として初めてアクセスする(ブロックとして)度に実記憶が割当たるのです。 そして、2度目のループ For i = 1 to 100000000 Hai(i) = 2 Next では、実記憶の確保(=割当)は起きない(ページイン、ページアウトは起きるだろうけれども)ので、その分時間が掛からない。 で説明できると思う。 又、三度目のループの実行時間については、最初のループより実行時間が掛かる点については実行環境が関わってるので プロセッサーのキャッシュの大きさや、主記憶の大きさ、32bit OS なのか 64bit OS なのかなどが関係すると思われるので これだとはっきりとは言えませんね。ほぼ 40MB の配列の大きさなので、プロセッサーのキャッシュに納まりきれそうにないので プロセッサーのキャッシュと主記憶との入れ替えは起こっていそうだとは想像できますが...
- Child Tree -