雨谷の日和

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

Javaでの行列式計算(再帰無し、動的、最適化無)

では、まずは最適化無しのprofileを見てみよう。

result: 489261678

Flat profile of 75.86 secs (4802 total ticks): main

  Interpreted + native   Method                        
 44.4%  1833  +   297    Test.expand02
 30.9%  1392  +    92    Test.expand03
 14.5%   663  +    33    Test.expand04
  5.2%   237  +    11    Test.expand05
  1.9%    90  +     0    Test.expand01
  1.3%    63  +     0    Test.expand06
  0.4%    20  +     0    Test.expand07
  0.1%     5  +     0    Test.expand08
  0.0%     0  +     1    java.io.FileInputStream.open
 98.7%  4303  +   434    Total interpreted

  Thread-local ticks:
  0.1%     3             Blocked (of total)
  0.0%     1             Class loader
  0.5%    22             Interpreter
  0.8%    36             Unknown: running frame
  0.1%     3             Unknown: thread_state


Global summary of 75.88 seconds:
100.0%  4856             Received ticks
  0.9%    44             Received GC ticks
  0.1%     7             Other VM operations
  0.0%     1             Class loader
  0.5%    22             Interpreter
  0.8%    39             Unknown code

結果としては約76秒となった。
2004.04.05での結果は約90秒だったから、約14秒の改善である。
2004.04.05の結果と最も異なるのは、やはり展開した部分だろうか。
展開せず再帰呼び出しで書いた場合には、以下のようになっていた。

99.1%  5204  +   454    Test.expand

それに該当するのは以下の部分。

 44.4%  1833  +   297    Test.expand02
 30.9%  1392  +    92    Test.expand03
 14.5%   663  +    33    Test.expand04
  5.2%   237  +    11    Test.expand05
  1.9%    90  +     0    Test.expand01
  1.3%    63  +     0    Test.expand06
  0.4%    20  +     0    Test.expand07
  0.1%     5  +     0    Test.expand08

上記を合計すると、以下のようになる。

98.7%  4303  +   433    (expand01〜expand08合計)

ticks差で922、秒数にすると約14秒だから、やはり再帰呼び出しを展開したのが効いていると考えて良さそうだ。
expand09、expand10、expand11は呼び出される回数が少ないためか、処理全体に占める負荷の割合が少ないのだろう。ここの表示では省略されているようだ。
expand01は処理としてはかなり軽いのだが、回数だけはダントツで多いので、上位に入っている。
他の関数については処理回数の多い順に並んでいるのが分かる。


明日は、最適化有のprofileを見てみよう。