雨谷の日和

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

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

2004.04.03〜2004.03.06までの結果で、行列式の計算(ソースコード2004.03.312004.04.02で提示)を比較したところ、CよりもJavaの方が速いという結果となった。
その結果について色々と考えたのだが、一つの可能性として「Cは動的メモリ確保が遅いのではないか」というのを思いついた。
JavaはJavaVMが起動する際にメモリを一気に確保しておき、その領域を使い回すような感じ(メモリプーリングという感じ)で、メモリの動的取得の性能を向上させることができるような気がしたからである。
一方のCでは、実行時にそうした機能が自動でなされるはずが無いので、いちいち動的取得するたびにかなり重い処理を実行してしまっているのではないだろうか。
ソースコード上では同じ動的メモリ取得の処理に見えても、Javaのそれは実際には動的取得のプロセスを省いたものではないのだろうか。


……ということを考えたのだが、ちょっと気になる結果が出てしまった。
kp氏の指摘で不採用にしたgcc拡張の可変長配列でのソースコードを実行してみたのだ。→2004.03.30付の「Cでの行列式計算」にて提示。

20:29:36
result: 489261678
20:29:44
result: 489261678
20:29:51
result: 489261678
20:29:56
result: 489261678
20:30:00
result: 489261678
20:30:05

なんと、最適化無しで約8秒、最適化有りだと約5秒という結果となった。
これはJavaの最適化有りの場合と同程度、それよりもやや速いという結果である。
gcc拡張の書き方をしても、それは実行時に自動でメモリプーリングを行ってくれるわけではないように思える。
私が前述した理屈では、このソースコードの方がmalloc/freeを使ったものよりも速くなる現象の説明が出来ない。
これはどういうことだろうか。ますます分からなくなってしまった。うーむ。


ただ、どうやら動的メモリ確保の辺りが怪しいということは確かなようである。
そこら辺を上手いこと調べる方法を考えようと思う。