私は Molecular Dynamic アルゴリズムをテストしていました。これは、とりわけ、9 つの double 配列で構成されたクラス Particle を持ち、粒子コンポーネント (3D 環境での速度、力、および位置) を格納します。
5 つの入力サイズを使用してアルゴリズムをテストします。
Size (MB) Time (s)
0.06 0.36 (fits in cache L2)
0.14 1.79 (fits in cache L2)
0.60 36.86 (fits in cache L3)
1.35 182.24 (fits in cache L3)
17.38 566.55 (it only fits in RAM)
Particles
レイアウトを からarray
に変更しますArrayList
。連続したメモリ ブロックを作成するために、占有するサイズで arrayList を作成しました。
ArrayList <Double> px = new ArrayList <Double>(Input_Size);
上記の睾丸と同じ条件でバージョンを実行したところ、結果は次のようになりました。
Size (MB) Time (s)
0.06 0.608
0.14 2.78
0.60 57.15
1.35 299.24
17.38 1436,42
テスト環境は次のとおりです。
AMD Opteron プロセッサ 6174、800 MHz、12 MB キャッシュ L3、24 コア。
約2倍のスピードダウンを得ています。これは正常ですか?ArrayList
配列のようにメモリに連続して割り当てられるため、両方のバージョンでほぼ同じ時間を期待するべきではありませんか?
編集:
Running with the option **-XX:+PrintCompilation**
WITH ARRAY:
1 java.util.jar.Manifest$FastInputStream::readLine (167 bytes)
2 sun.nio.cs.UTF_8$Decoder::decodeArrayLoop (553 bytes)
3 java.lang.String::hashCode (60 bytes)
4 java.lang.String::charAt (33 bytes)
5 sun.security.util.ManifestDigester::findSection (180 bytes)
6 java.lang.Object::<init> (1 bytes)
7 moldyn.random::update (104 bytes)
8 moldyn.random::seed (80 bytes)
--- n java.lang.StrictMath::log (static)
9 java.lang.Math::log (5 bytes)
10 moldyn.md::scalingVelocity (82 bytes)
11 moldyn.Particles::distance (192 bytes)
1% moldyn.Particles::force @ 42 (211 bytes)
12 moldyn.Particles::force (211 bytes)
13 moldyn.Particles::domove (163 bytes)
14 moldyn.Particles::domove_out (160 bytes)
2% moldyn.Particles::cicle_domove @ 5 (23 bytes)
15 moldyn.Particles::update_force (49 bytes)
3% moldyn.Particles::cicle_forces @ 6 (27 bytes)
16 moldyn.Particles::mkekin (141 bytes)
4% moldyn.Particles::cicle_mkekin @ 9 (33 bytes)
17 moldyn.Particles::velavg (70 bytes)
5% moldyn.Particles::cicle_velavg @ 9 (37 bytes)
18 moldyn.Particles::cicle_domove (23 bytes)
19 moldyn.Particles::cicle_forces (27 bytes)
20 moldyn.Particles::cicle_mkekin (33 bytes)
21 moldyn.Particles::cicle_velavg (37 bytes)
36.763
WITH ArrayList <Double>....
----
1 java.util.jar.Manifest$FastInputStream::readLine (167 bytes)
2 sun.nio.cs.UTF_8$Decoder::decodeArrayLoop (553 bytes)
3 java.lang.String::hashCode (60 bytes)
4 java.lang.String::charAt (33 bytes)
5 sun.security.util.ManifestDigester::findSection (180 bytes)
6 java.lang.Object::<init> (1 bytes)
--- n java.lang.System::arraycopy (static)
7 java.lang.Number::<init> (5 bytes)
8 java.util.ArrayList::ensureCapacity (58 bytes)
9 java.lang.Double::valueOf (9 bytes)
10 java.lang.Double::<init> (10 bytes)
11 java.util.ArrayList::add (100 bytes)
12 java.util.ArrayList::RangeCheck (48 bytes)
13 java.util.ArrayList::set (21 bytes)
14 moldyn.random::update (104 bytes)
15 moldyn.random::seed (80 bytes)
--- n java.lang.StrictMath::log (static)
16 java.lang.Math::log (5 bytes)
17 java.util.ArrayList::get (12 bytes)
18 java.lang.Double::doubleValue (5 bytes)
19 moldyn.md::scalingVelocity (120 bytes)
20 moldyn.Particles::distance (240 bytes)
1% moldyn.Particles::force @ 42 (211 bytes)
21 moldyn.Particles::force (211 bytes)
22 moldyn.Particles::domove (337 bytes)
23 moldyn.Particles::domove_out (292 bytes)
2% moldyn.Particles::cicle_domove @ 5 (23 bytes)
24 moldyn.Particles::update_force (91 bytes)
3% moldyn.Particles::cicle_forces @ 6 (27 bytes)
25 moldyn.Particles::mkekin (297 bytes)
4% moldyn.Particles::cicle_mkekin @ 9 (33 bytes)
26 moldyn.Particles::velavg (118 bytes)
5% moldyn.Particles::cicle_velavg @ 9 (37 bytes)
27 moldyn.Particles::cicle_domove (23 bytes)
28 moldyn.Particles::cicle_forces (27 bytes)
29 moldyn.Particles::cicle_mkekin (33 bytes)
30 moldyn.Particles::cicle_velavg (37 bytes)
55.98