Приветствую! Привожу простые тесты, показывающие, что при известных границах поиска лучше использовать For…Next — он в 2 раза быстрее. Разумеется, чем более сложные расчёты будут в теле цикла, тем менее будет заметна разница в скорости самих циклов.
Option Base 1
Option Explicit
Option Private Module
'====================================================================================================
Sub Test()
Dim t!, n&, res&
Const cyc& = 100000000
n = 0: t = Timer
Do
n = n + 1: res = n
If n = cyc Then Exit Do
Loop
Debug.Print "Do…Loop", Format$(Timer - t, "0.0")
n = 0: t = Timer
Do While n < cyc
n = n + 1: res = n
Loop
Debug.Print "DoWhile…Loop", Format$(Timer - t, "0.0")
n = 0: t = Timer
Do Until n = cyc
n = n + 1: res = n
Loop
Debug.Print "DoUntil…Loop", Format$(Timer - t, "0.0")
n = 0: t = Timer
For n = 1 To cyc
res = n
Next n
Debug.Print "For…Next", Format$(Timer - t, "0.0")
End Sub
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
тем более - лишним не будет сделать тему с готовыми данными
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
_Boroda_: В Дулупе проверка каждый раз идет, а в Форнексте просто счетчик
всё верно - никаких неожиданностей, просто в 2 раза разница не была ожидаема от простого счётчика даже на 100 млн)) 100 млн хоть и кажется нереальным циклом, однако есть рекурсия и прочие вложенные циклы — в комбинаторике, например. В таком случае, и большее количество итераций вполне возможно
Msi2102, благодарю за дополнительные тесты While…Wend, помнится, хуже себя показал на рекурсии, чем Do…Loop — потому я нигде его и не использую
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄