Страница: 1 |
Страница: 1 |
Вопрос: Какой цикл пошустрее?
Добавлено: 03.06.05 19:19
Автор вопроса: Страшный Сон
В VB есть три способа сделать один и тот же цикл:
For I = 0 To N
' CODE
Next I
I = 0
Do While I <= N
' CODE
I = I + 1
Loop
I = 0
While I <= N
' CODE
I = I + 1
Wend
Или есть еще какие-то способы? Есть ли разница в скорости работы этих циклов?
Ответы
Всего ответов: 12
Номер ответа: 1
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #1
Добавлено: 03.06.05 19:23
К сведению, синтаксическая конструкци While...Wend удалена из языка
VB в одной из последних версий (либо 2005, либо Oscar, точно не
помню).
Номер ответа: 2
Автор ответа:
Morpheus
Вопросов: 224
Ответов: 3777
Web-сайт:
Профиль | | #2
Добавлено: 03.06.05 19:23
По моему самый быстрый цикл вот такой:
For i = N to 0 step -1
' code
Next i
так как с нулём сравнивать легче.
Номер ответа: 3
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #3
Добавлено: 03.06.05 21:20
А еще
i=0
m1:
' CODE
i = i + 1
If i<=N Then m1
Номер ответа: 4
Автор ответа:
Morpheus
Вопросов: 224
Ответов: 3777
Web-сайт:
Профиль | | #4
Добавлено: 03.06.05 21:50
2 Sharp:
чё это за доисторический код ))))))))) я так раньше писал, когда не умел For Next делать
Номер ответа: 5
Автор ответа:
Sur
ICQ: 1249088
Вопросов: 10
Ответов: 304
Web-сайт:
Профиль | | #5
Добавлено: 03.06.05 22:57
Do
' CODE
I = I + 1
Loop While I <= N
Номер ответа: 6
Автор ответа:
AgentFire
ICQ: 192496851
Вопросов: 75
Ответов: 3178
Профиль | | #6
Добавлено: 04.06.05 00:07
У Sharp'а правильней всего. Так быстрее. Проверено.
Номер ответа: 7
Автор ответа:
System
ICQ: 777110
Вопросов: 0
Ответов: 3
Web-сайт:
Профиль | | #7
Добавлено: 05.06.05 16:34
2Noviks слишком смелое утверждение которое на деле показывает совсем обратное
Создаём на форме тексбокс ставим multiline=true, кидаём на форму кнопку, в код формы вставляем это:
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Sub Command1_Click()
Dim v As Integer
Dim i As Long
Dim j As Long
Dim c As Long
Dim c2 As Long
Text1 = "Test1. Goto" & vbCrLf
c2 = 0
For j = 1 To 10
c = GetTickCount
i = 0
m1:
v = Sqr(9)
i = i + 1
If i <= 1000000 Then GoTo m1
c2 = c2 + GetTickCount - c
Next j
Text1 = Text1 & c2 \ 10 & vbCrLf & "Test2. For-next" & vbCrLf
c2 = 0
For j = 1 To 10
c = GetTickCount
For i = 0 To 1000000
v = Sqr(9)
Next i
c2 = c2 + GetTickCount - c
Next j
Text1 = Text1 & c2 \ 10 & vbCrLf & "Test3. For Step -1 -next" & vbCrLf
c2 = 0
For j = 1 To 10
c = GetTickCount
For i = 1000000 To 0 Step -1
v = Sqr(9)
Next i
c2 = c2 + GetTickCount - c
Next j
Text1 = Text1 & c2 \ 10 & vbCrLf & "Test4. Do while" & vbCrLf
c2 = 0
For j = 1 To 10
c = GetTickCount
i = 0
Do While i <= 1000000
v = Sqr(9)
i = i + 1
Loop
c2 = c2 + GetTickCount - c
Next j
Text1 = Text1 & c2 \ 10
End Sub
в 90% обычный For next показывает самый быстрый результат
на втором месте - For Step -1
на третьем - Goto, на четвёртом Do
вот мои результаты
Test1. Goto
190
Test2. For-next
112
Test3. For Step -1 -next
128
Test4. Do while
212
Номер ответа: 8
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #8
Добавлено: 05.06.05 18:22
В скомпилённом виде наверняка один хрен будет...
Номер ответа: 9
Автор ответа:
Страшный Сон
Вопросов: 46
Ответов: 848
Профиль | | #9
Добавлено: 05.06.05 22:41
А вот мои результаты вышеописанной проги (повторял несколько раз):
Test1. Goto
20
Test2. For-next
18
Test3. For Step -1 -next
20
Test4. Do while
20
Test1. Goto
20
Test2. For-next
20
Test3. For Step -1 -next
18
Test4. Do while
20
Test1. Goto
18
Test2. For-next
20
Test3. For Step -1 -next
20
Test4. Do while
20
Test1. Goto
18
Test2. For-next
20
Test3. For Step -1 -next
20
Test4. Do while
18
ВЫВОД: Циклы практически одинаковы по быстродействию.
Номер ответа: 10
Автор ответа:
Morpheus
Вопросов: 224
Ответов: 3777
Web-сайт:
Профиль | | #10
Добавлено: 05.06.05 22:52
надо бенчмарки провести и выложить результаты
Номер ответа: 11
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #11
Добавлено: 06.06.05 10:17
2Страшный Сон, ну кто так бенчмаркит? Подними количество итераций по крайней мере в десять раз. Щас ты тестируешь свою систему, а не требуемый код, время его выполнения слишком мало и слишком зависимо от случая.
Номер ответа: 12
Автор ответа:
Страшный Сон
Вопросов: 46
Ответов: 848
Профиль | | #12
Добавлено: 10.06.05 11:16
Ну поднял, а толку то... Разница все равно слишком мала:
Test1. Goto
198
Test2. For-next
200
Test3. For Step -1 -next
201
Test4. Do while
200
Test1. Goto
198
Test2. For-next
198
Test3. For Step -1 -next
198
Test4. Do while
198
Test1. Goto
196
Test2. For-next
196
Test3. For Step -1 -next
201
Test4. Do while
198