大学で8086アセンブリを行ったときから、次のことを行う方がパフォーマンスが良かったことを覚えています。
for (int i = 6; i > -1; i--)
兆候がない場合はジャンプを意味するJNS操作があったため。これを使用すると、各サイクルの後に比較値を取得するためのメモリルックアップがなく、比較も行われませんでした。最近では、ほとんどのコンパイラがレジスタの使用を最適化するため、メモリの問題はもはや重要ではありませんが、それでも不要な比較が可能です。
ちなみに、ループに7または6を入れると、「マジックナンバー」が導入されます。読みやすくするために、意図を明らかにする名前の定数を使用する必要があります。このような:
const int NUMBER_OF_CARS = 7;
for (int i = 0; i < NUMBER_OF_CARS; i++)
編集:人々はアセンブリのものを取得していないので、より完全な例が明らかに必要です:
(i = 0; i <= 10; i ++)の場合、これを行う必要があります。
mov esi, 0
loopStartLabel:
; Do some stuff
inc esi
; Note cmp command on next line
cmp esi, 10
jle exitLoopLabel
jmp loopStartLabel
exitLoopLabel:
(int i = 10; i> -1; i--)を実行すると、次のように回避できます。
mov esi, 10
loopStartLabel:
; Do some stuff
dec esi
; Note no cmp command on next line
jns exitLoopLabel
jmp loopStartLabel
exitLoopLabel:
確認したところ、MicrosoftのC ++コンパイラはこの最適化を実行しませんが、実行すると次のようになります。
for (int i = 10; i >= 0; i--)
したがって、道徳は、Microsoft C ++†を使用していて、昇順でも降順でも違いがない場合、すばやくループを取得するには、次のように使用する必要があります。
for (int i = 10; i >= 0; i--)
これらのいずれかではなく:
for (int i = 10; i > -1; i--)
for (int i = 0; i <= 10; i++)
しかし、率直に言って、「for(int i = 0; i <= 10; i ++)」の可読性を取得することは、通常、1つのプロセッサコマンドを見逃すよりもはるかに重要です。
†他のコンパイラは異なることをするかもしれません。