雨谷の日和

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

ボヤキ - 技術

JavaとCとの性能比較(行列式計算/再帰呼び出し有)

ということで、ここまでで再帰呼び出し有りの行列式計算での性能比較は一区切りとしたい。 出力処理の時と同じく、比較表にまとめておこう。 Pentium4:2.4GHzWindowsXP(MS932)cygwingcc3.3.1JDK1.4 CJava 最適化無最適化有インタプリタHotSpotAOT mallocall…

一次キャッシュの効果

2004.04.17付の日記で、以下のようなことを書きました。 これで分かることは、それが例えmallocで確保されたものであっても、メモリ領域にアクセスするだけなら特に性能劣化の原因にはならないということだろうか。 要するに、malloc/freeの処理そのものが遅…

Javaでの行列式計算(事前メモリ確保での実装/AOT)結果

では今度は2004.04.20付の事前メモリ確保での行列式計算のソースコードでAOTコンパイラを使った場合を実測してみよう。 昨日と同じようにコンパイル、実行した結果が以下である。 20:51:25 result: 489261678 20:51:35 result: 489261678 20:51:41 result: 4…

Javaでの行列式計算(動的メモリ確保での実装/AOT)結果

では、まず2003.03.31付で提示した、動的メモリ確保して行列式を計算させるソースコードをコンパイルし、実行してみよう。 コンパイルは以下のようにして行った。 gcj -o jtest.exe --main=Test Test.java gcj -o jtest1.exe -fno-bounds-check -fno-store-c…

JavaのAOTコンパイラ

さて、ちょっとここで比較項目を増やそうと思う。 いままでJavaについてはHotSpotでの最適化のみを取り上げて比較してきた。 しかしJavaでは実行時最適化のHotSpotの他にも、Cと同じような実行前最適化の技術の研究も為されている。 Ahead of time(AOT)コ…

Javaでの行列式計算(事前メモリ確保での実装/最適化有)結果

2004.04.21と同じものを、こんどは最適化有りで実行してみたprofilegは、以下である。 result: 489261678 Flat profile of 7.62 secs (487 total ticks): main Interpreted + native Method 0.2% 1 + 0 java.util.jar.Attributes.read 0.2% 1 + 0 Total int…

Javaでの行列式計算(事前メモリ確保での実装/最適化無)結果

では、2004.04.20のソースを最適化無しで実行してみよう。 result: 489261678 Flat profile of 81.38 secs (5208 total ticks): main Interpreted + native Method 99.4% 5179 + 0 Test.expand 0.0% 0 + 1 java.util.zip.Inflater.inflateBytes 99.5% 5179 +…

Javaでの行列式計算(事前メモリ確保での実装)

それでは、Javaでも事前にメモリを確保してから処理を行うように書いてみよう。 以下のようになる。 class Test { private static long[ ][ ] array_buf; private static long expand(long[ ] array, int dim) { if(dim 次回と次々回をかけて、最適化無/有の…

Cでの行列式計算(事前メモリ確保での実装)結果2

2004.04.16付け付のソースの、mallocの部分をallocaに変えてコンパイルし直し、同じようにして実行してみた。(freeの行も削除した) 結果は以下である。 20:16:26 result: 489261678 20:16:32 result: 489261678 20:16:37 result: 489261678 20:16:41 resul…

Cでの行列式計算(事前メモリ確保での実装)結果

2004.04.16付のソースを実行してみた。 20:13:14 result: 489261678 20:13:20 result: 489261678 20:13:25 result: 489261678 20:13:29 result: 489261678 20:13:32 result: 489261678 20:13:35 最適化無しで約5秒、最適化有りだと約3秒という結果である。非…

Cでの行列式計算(事前メモリ確保での実装)

malloc/freeでの動的なメモリの管理に負荷がかかる(そしてこれはkp氏の指摘にあるように、必要な負荷である)ことから、高速化のためには、必要なメモリ領域を事前に確保しておくと良さそうだということが分かった。 ということで、事前にメモリを確保する…

Cでの行列式計算(allocaでの実装)結果

では、2004.04.14付「Cの行列式計算(allocaでの実装)」で示したソースコードをコンパイルし、実行してみよう。 20:56:28 result: 489261678 20:56:36 result: 489261678 20:56:44 result: 489261678 20:56:48 result: 489261678 20:56:52 result: 4892616…

Cの行列式計算(allocaでの実装)

kp氏の指摘では、gccの可変長行列の実装はallocaでの実装に近いはずだというだった。 なのでまずはその検証を行っておこう。 以下のように、mallocでのメモリ確保部分をallocaに変える。この場合、freeでの解放処理は必要ない(allocaの場合、スタック領域に…

Cのmalloc/freeは遅い

2004.04.11付けで、Cのmalloc/freeよりもgccの可変長配列の方が速いということを書いたところ、kp氏がその理由を調べた結果を書いておられます。→「メモリ動的確保」 をを〜。適切な情報源と明快な結論で、とても参考になりました。素晴らしい。 ということ…

Cの動的メモリ確保が遅いのかも

2004.04.03〜2004.03.06までの結果で、行列式の計算(ソースコードは2004.03.31と2004.04.02で提示)を比較したところ、CよりもJavaの方が速いという結果となった。 その結果について色々と考えたのだが、一つの可能性として「Cは動的メモリ確保が遅いので…

プロファイラの重要性

kp氏が2004-04-03付の「補足」で、思うところを述べられている。 kp氏の意見を私なりに解釈するなら「大抵の言語は大抵のプログラムが要求する性能を実現できる。だから、言語の選択で実行性能を重視する場面はあまり多くない」ということになるでしょうか。…

Javaでの行列式計算(最適化有)

では、昨日と同じ処理を、こんどは最適化有りで実行してみる。 java -Xprof Test 結果は以下のようになった。 result: 489261678 Flat profile of 8.88 secs (541 total ticks): main Interpreted + native Method 0.2% 0 + 1 java.util.zip.ZipFile.open 0.…

Javaでの行列式計算(最適化無)

では、Javaの場合の行列式計算を実行し、そのprofileを見てみよう。 まずは最適化無しで実行してみる。 java -Xprof -Xint Test 結果は以下のようになった。 result: 489261678 Flat profile of 90.10 secs (5728 total ticks): main Interpreted + native M…

行列式計算ではなかったようです

2004.04.01に書いた「再帰呼び出しだとJava も C もたいして速度に差はない?」について、屁理屈太郎氏からコメント頂いています。→「へけ」の4/4 いつも有難うございます。 ご指摘を読みましたところ、どうやら、私が勘違いをしていたようです。以下引用し…

Cでの行列式計算(malloc/freeでの実装)の結果

2004.04.02付けの「Cでの行列式計算(malloc/freeでの実装)」のソースコードを用いてその実行に掛かる時間を測ってみる。 なお、実行環境は以前と同じでPentium4:2.4GHz + WindowsXP + cygwin + gcc3.3.1 である。 最適化の深度の違いも考慮したいので、コ…

Cでの行列式計算(malloc/freeでの実装)

kp氏に指摘頂いたので、2004.03.30のソースをmalloc/freeでの実装に書き換えてみた。有難うございます。 #include #include long expand(long array[], int dim) { int i, j, k, l; long value = 0; long *subarray; if(dim malloc( (dim - 1) * (dim - 1) *…

Javaは速度を求めていない?

ここでのコメントで助言頂いているkp氏が、ご自身のサイト(monthly mho/diary)でJavaとCとの比較について言及頂いています。いつも有難うございます。コメントします。 以下、氏のサイトの2004-04-01から引用です。 そもそもの言語のコンセプトとして、Ja…

再帰呼び出しだとJava も C もたいして速度に差はない?

屁理屈太郎氏からのツッコミを頂いたので、コメントします。いつも有難うございます。 「へけ」の「4/1 02:39 #7」より。 提示されてゐるソースコードに含まれる要素は、(1)配列の動的確保、(2)多重ループ、(3)四則演算、(4)配列へのアクセス、(5)クラスの再…

Javaでの行列式計算

昨日掲示したCのソースでは可変長配列を使っていたのだが、kp氏から可変長配列は拡張機能なので、malloc/freeを使ったものに書き換えた方が良いという指摘を頂いた。有難うございます。 近日中に、書き直してみようと思う。 とりあえず本日は、Javaの方のソ…

Cでの行列式計算

もう一ヶ月も前のご指摘で、私の歩みの遅さに愕然としてしまうのだが、屁理屈太郎氏の指摘「Java と C」にあった、以下の部分を参考にして、行列式の計算でCとJavaの性能比較を行いたい。 できれば、「とにかくループをまはす」とか「行列式の計算をさせる…

JavaとCとの性能比較(ファイル出力処理)

ということで長々とかかってしまったが、ファイル出力処理におけるJavaとCとの性能比較はここまでで一区切りである。 まとめておこう。 Pentium4:2.4GHzWindowsXP(MS932)cygwingcc3.3.1JDK1.4 CJava 最適化無最適化有最適化無最適化有(*3) Encode無Encode…

Javaの文字列出力(バッファリング有/最適化有)

前回と同じ処理を、最適化有で実行してみよう。 Flat profile of 6.16 secs (394 total ticks): main Interpreted + native Method 1.0% 0 + 4 java.io.FileOutputStream.writeBytes 0.3% 0 + 1 java.util.HashMap.put 0.3% 0 + 1 java.security.BasicPermis…

Javaでの文字列出力(バッファリング有/最適化無)

Javaの文字列出力でバッファリングを行うには、BufferedWriterを使えばよい。 以下のようになる。 import java.io.PrintWriter; import java.io.BufferedWriter; import java.io.FileWriter; class Test { public static void main(String[] args) throws Ex…

入出力処理のCとJavaの性能比較のまとめ

今までに測ってきた結果を、表にまとめておこう。 Pentium4:2.4GHzWindowsXP(MS932)cygwingcc3.3.1JDK1.4 CJava 最適化無最適化有最適化無最適化有(*3) Encode無Encode有Encode無Encode有 出力(*2)バッファ無 161617153(*1)177(*1) バッファ有 559?4? ※単位…

Cでの出力(バッファリング無)

ということで、バッファリング無の場合のCのものを実行してみよう。 #include int main(void) { int i; FILE *out; const char buf[] = "Hello world!\n"; out = fopen("c_log.txt", "w"); setbuf(out, NULL); for(i = 0; i 結果は、以下のようになった。 2…