Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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-сайт: www.vbnet.ru
 Профиль | | #1
Добавлено: 03.06.05 19:23
К сведению, синтаксическая конструкци While...Wend удалена из языка
VB в одной из последних версий (либо 2005, либо Oscar, точно не
помню).

Ответить

Номер ответа: 2
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #2
Добавлено: 03.06.05 19:23
По моему самый быстрый цикл вот такой:

For i = N to 0 step -1
    ' code
Next i


так как с нулём сравнивать легче.

Ответить

Номер ответа: 3
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #3
Добавлено: 03.06.05 21:20
А еще

i=0
m1:
' CODE
i = i + 1
If i<=N Then m1

Ответить

Номер ответа: 4
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #4
Добавлено: 03.06.05 21:50
2 Sharp:
чё это за доисторический код :)))))))))) я так раньше писал, когда не умел For Next делать :)

Ответить

Номер ответа: 5
Автор ответа:
 Sur



ICQ: 1249088 

Вопросов: 10
Ответов: 304
 Web-сайт: sur.hotbox.ru/
 Профиль | | #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-сайт: zloysystem.com
 Профиль | | #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-сайт: xury.zx6.ru
 Профиль | | #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

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам