Когда вы опускаетесь до самого низкого уровня (машинный код, но я буду использовать ассемблер, поскольку он в основном отображает один-к-одному), разница между пустым циклом, уменьшающимся до 0, и одним, увеличивающимся до 50 (например), равна часто в соответствии с:
ld a,50 ld a,0
loop: dec a loop: inc a
jnz loop cmp a,50
jnz loop
Это потому, что флаг нуля в большинстве здравомыслящих процессоров устанавливается инструкцией уменьшения при достижении нуля. То же самое обычно нельзя сказать о инструкции приращения, когда она достигает 50 (поскольку в этом значении нет ничего особенного, в отличие от нуля). Таким образом, вам нужно сравнить регистр с 50, чтобы установить нулевой флаг.
Однако, спрашивая, какой из двух циклов:
for(int i = 100000; i > 0; i--) {}
for(int i = 1; i < 100001; i++) {}
быстрее (в значительной степени любая среда, Java или иная) бесполезна, поскольку ни одна из них не делает ничего полезного. самая быстрая версия обоих этих циклов без цикла вообще. Я призываю любого предложить более быструю версию, чем эта: -)
Они станут полезными, только когда вы начнете выполнять какую-то полезную работу внутри фигурных скобок, и в этот момент работа будет определять, какой порядок вы должны использовать.
Например, если вам нужно для подсчета от 1 до 100 000, вы должны использовать второй цикл. Это потому, что преимущество обратного отсчета (если оно есть), вероятно, будет сведено на нет тем фактом, что вы должны оценивать 100000-i
внутри цикла каждый раз, когда вам нужно его использовать. С точки зрения сборки, это будет разница между:
ld b,100000 dsw a
sub b,a
dsw b
(dsw
- это, конечно, печально известный do something with
мнемоник ассемблера).
Поскольку вы будете получать попадание для увеличивающегося цикла только один раз за итерацию, и вы будете принимать попадание для вычитания как минимум один раз за итерацию (при условии, что вы будете использовать i
, в противном случае цикл вообще не нужен), вам просто нужно перейти на более естественную версию.
Если вам нужно подсчитать, подсчитайте. Если вам нужно вести обратный отсчет, начните обратный отсчет.