次は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秒だったことを考えると、性能向上しているように見える。
ただ、再帰無しの場合には最適化をしても結果が同じくらいという点が異なっているようにも思える。