質問: ある配列における各値の1の位の合計を計算するために2つのコード ``` for(i=0; i= 10) sum += a[i] % 10; else sum += a[i]; } ``` を考えたのですが、 どちらの方がコーディング力は良いのでしょうか。 後者に比べると前者は各値が10以上でなくても、つまり全ての値に対し"% 10"として合計に加えているので 無駄が多い気もしますが後者みたいに場合分けをするよりコードが単純で美しい気がします。 追記 また、各値の桁の数を足し合わせてから、合計を計算する場合、前者の方法では ``` for(i=0; i
回答: 実測してみましょう。以下のような簡単なプログラムを作って試してみました。 ``` #include #include #define N 100000 double getTime(); int main() { double t0; int i; int sum; int a[N]; for (i = 0; i < N; i++) { /* a[i] = i; */ a[i] = i % 10; } t0 = getTime(); for (i = 0; i < N; i++) { sum += a[i] % 10; /* */ /* if (a[i] > 10) { */ /* sum += a[i] % 10; */ /* } else { */ /* sum += a[i]; */ /* } */ /* */ } printf("%d %f\n", sum, getTime() - t0); } double getTime() { struct timeval tv; gettimeofday(&tv, NULL); return tv.tv_sec + 1e-6 * tv.tv_usec; } ``` 家のMacで試したところ以下のような結果です。 | | ifなし | ifあり | | --- | --- | --- | | 1から100000 | 0.25ms | 0.31ms | | 全部10以下 | 0.25ms | 0.17ms | 結果から考えると以下のようなことが言えるのではないかと思います。 * ifを使わない方は配列の内容によらず一定時間 * ifを使うと10以下の要素の割合が少なければifの分だけ遅くなるが、10以下の要素が多ければ`%`の計算がいらない分速くなる * ifより`%`演算の方が2.3倍ぐらい時間がかかる * 10以下の要素の割合が57%ぐらいのところでどちらが速いかが逆転すると予想される このくらいの違いだとif使わない方が単純でいいでしょう。 ただし結果はCPUやコンパイラなどの条件でかわってくるところではあると思います。 たとえば昔の8bit CPUだと割り算がCPUでサポートされてなくてとてつもなく遅かったりするのでそういうときは複雑になってもifを使う価値があるかもしれません。