ということで、ここまでで再帰呼び出し有りの行列式計算での性能比較は一区切りとしたい。
出力処理の時と同じく、比較表にまとめておこう。
Pentium4:2.4GHz WindowsXP(MS932) cygwin gcc3.3.1 JDK1.4 |
C | Java | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
最適化 無 | 最適化 有 | インタ プリタ | Hot Spot | AOT | ||||||
malloc | alloca | malloc | alloca | 最適化 無 | 最適化 配列 | 最適化 有 | ||||
行列式 計算 | 動的メモリ確保 | 46 | 8 | 43 | 4 | 90 | 9 | 55 | 52 | 49 |
事前メモリ確保 | 5 | 5 | 3 | 3 | 81 | 8 | 10 | 6 | 5 |
・外部要因的な負荷の影響が少ない処理では、メモリの取り扱い方が性能に大きく影響する(メモリの取り扱いがボトルネックになりやすい)。
・CとJavaではメモリの取り扱いの思想が異なるため、その性能の特徴が異なる。
・Cの場合、動的にヒープ領域のメモリを確保する際のコストが高い。逆に事前にメモリを確保するなどしてヒープ領域のメモリ管理の手間を極力減らした場合、高い性能を発揮する。
・Javaの場合、動的にヒープ領域のメモリを確保する際のコストはあまり高くない。その代わり、ヒープ領域のメモリ管理の手間を極力減らしても、それほど性能が向上するわけではない。
・JavaのAOTコンパイラを用いた結果は、Cの結果に近い。
今後は再帰呼び出しの影響を調べるか、一次キャッシュなどの効果を調べるか、別途のプログラムを比較してみるか、ちょっと考えてみようと思う。