私が大学で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つのプロセッサコマンドがないことよりもはるかに重要です。
†他のコンパイラは別のことをするかもしれません。