雨谷の日和

過去12年で1,600を超えるアニメの第1話だけは見続けた僕のお勧めアニメがハズレなはずがない

JavaとCとの性能比較(行列式計算)

ということで、再帰有りと再帰無しの結果を表にまとめておく。


Pentium4:2.4GHz
WindowsXP(MS932)
cygwin
gcc3.3.1
JDK1.4
Java
最適化
最適化
インタ
プリタ
Hot
Spot
AOT
mallocallocamallocalloca最適化
最適化
配列
最適化
行列式
計算
再帰
有り
動的メモリ確保 468434909555249
事前メモリ確保 55338181065
再帰
無し
動的メモリ確保 443423767525249
事前メモリ確保 3422666754
※単位はいずれも[sec]


関数に展開するだけではほとんど差が無いのではないかと私は考えていたが、こうして見ると結構、向上しているように思える。
特に、性能が良い場合(展開前で、既に実行時間が数秒のもの)には、数秒の向上でも効果大と言えそうだ。
ぎりぎりまでの性能向上を目指す場合には、再帰の関数への展開でも有効という結論で良いと思う。
逆に、そもそも性能の悪いものの場合、再帰の展開の効果は全体としては微々たるものなので、まずはボトルネックとなる部分を解消するのが本筋ということになるだろう。今回の場合は、動的メモリ確保を止めて事前にメモリを確保しておく方法に変更することがそれに該当する。


さて、次は再帰をループに展開した場合を実測したいと思っている。
が、まずはその前にループへの展開をちまちまと順を追って書いていきたいと思う。