読者です 読者をやめる 読者になる 読者になる

プログラムdeタマゴ

nodamushiの著作物は、文章、画像、プログラムにかかわらず全てUnlicenseです

JAVAの嘘本当 配列メモリの確保は速い?

JAVA

配列なんかで、JAVAはそもそもJVMで確保したメモリを配置するだけなんだから、メモリの確保は速いんだー、どんどん生成して使えば良いんだー、という意見を時々見る。というわけで、調べてみた。当方CPUはi5の3.2GHz,メモリはDDR3の何かだ。細かいことは忘れたw
 
100,0000(百万)要素の配列の確保にどれほど時間がかかるのか。
測定結果は一回の確保に平均0.4msecかかった。
一千万なら4msecと線形的に増えている。
(なお、実行時にXmsオプションは512mを指定している。この値を設定しない場合も百万程度なら大差はなかったが、一千万は平均15msecかかった。)
 
これを速いと見るか遅いと見るかは、プログラムの性質によってかなり異なるだろう。CやC++で毎回動的にこの量を確保したらこの速度では当然間に合わないから速いと言えるが、百万程度の配列をしょっちゅう保持しうるプログラムから言えば相当重たい処理だ。
 
さらに、単に生成ではなくclone関数を使えば100万要素の確保に1.5msかかる。もともと保持していた100万要素の配列に100万要素の別の配列をSystem.arraycopyを使えってコピーすると平均0.95msかかったので、単純にcloneすると確保+コピーの時間がかかる様だ。
 
ここは元々ずっと保持しておいた配列にSystem.arraycopyを行った方が、メモリをオールド領域に追いやってGCも回避できるし、明らかにお得だ。
 
もちろん、速度をさほど求めないなら十分な速度だろう。そもそも、普通のプログラムでは100万の配列を扱うかどうかも怪しい。
1万程度なら11マイクロ秒とミリ秒程度しか見ていないなら誤差にもならない。
(あ〜、それでも100分の1ミリ秒も使うんだな………。と思ったのは私だけで良い。)
 
 
結論:
1万程度の配列も使わないような普通のプログラムなら本当。気にせず動的生成したまえ
私からみたら嘘っぱちも良いところ。結局Cと変わらず自分でメモリ管理しなくてはならない。もちろん後ろに超優秀なGCがいるからCと比べれば格段に管理が楽だが………