雨谷の日和

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

Cでの行列式計算(再帰無し、動的alloca)

次はmalloc/freeの代わりにallocaを用いた場合を実測しよう。
ソースコードの該当部分は、以下のように変更する。

long expand11(long array[]) {
  int i, j, k, l;
  long value = 0;
  long *subarray;
  subarray = (long *)alloca(10 * 10 * sizeof(long));
  for(i = 0; i < 11; ++i) {
    l = 0;
    for(j = 0; j < 11; ++j){
      if(j != i){
        for(k = 1; k < 11; ++k)subarray[(l * 10) + k - 1] = array[(j * 11) + k];
        ++l;
      }
    }
    if(i % 2 == 0){
      value += (array[i * 11] * expand10(subarray));
    }else{
      value -= (array[i * 11] * expand10(subarray));
    }
  }
  return value;
}

実行した結果は以下のようになった。

19:59:05
result: 489261678
19:59:08
result: 489261678
19:59:11

最適化無し/最適化有りともに、約3秒となっている。
再帰有りの場合がそれぞれ約8秒、約4秒だったことを考えると、性能向上しているように見える。
ただ、再帰無しの場合には最適化をしても結果が同じくらいという点が異なっているようにも思える。