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 | ||
再帰 無し | 動的メモリ確保 | 44 | 3 | 42 | 3 | 76 | 7 | 52 | 52 | 49 | |
事前メモリ確保 | 3 | 4 | 2 | 2 | 66 | 6 | 7 | 5 | 4 |
関数に展開するだけではほとんど差が無いのではないかと私は考えていたが、こうして見ると結構、向上しているように思える。
特に、性能が良い場合(展開前で、既に実行時間が数秒のもの)には、数秒の向上でも効果大と言えそうだ。
ぎりぎりまでの性能向上を目指す場合には、再帰の関数への展開でも有効という結論で良いと思う。
逆に、そもそも性能の悪いものの場合、再帰の展開の効果は全体としては微々たるものなので、まずはボトルネックとなる部分を解消するのが本筋ということになるだろう。今回の場合は、動的メモリ確保を止めて事前にメモリを確保しておく方法に変更することがそれに該当する。
さて、次は再帰をループに展開した場合を実測したいと思っている。
が、まずはその前にループへの展開をちまちまと順を追って書いていきたいと思う。