どの構成が好ましいのか、そしてその理由は?
A:
if(i < 1023)
++i;
else
i = 0;
B:
++i;
if(i == 1024)
i = 0;
C:
i = (i + 1) & 1023;
または他?
代替Cは小さく、分岐がない(つまり、パイプラインの中断がない)ので気に入っていますが、1024回ごとに1回だけ役立つAND演算を実行します...
私は毎回オプションCを選びます。すぐにはわかりにくいかもしれませんが、このイディオムはコーディングの経験がある人なら誰でも十分に明確であり、条件付きブランチを節約できます。最新の(つまり、過去10年間で簡単に何でも)スーパースカラープロセッサでは、ボトルネックはメモリや分岐予測です。バイナリANDのような算術演算は、近似的には無料です。
100kのforループで実行すると、次の結果が得られます
。A:10.439秒
B:9.845秒
C:9.482秒
個人的には、この種の表記に慣れているため、Aを使用します。速度が問題になる場合は、Cがこれら3つの中で最高のようです。