Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

Страница: 1 |

 

  Вопрос: Как узнать, с какой скоростью выполняется цикл ... Добавлено: 18.07.03 05:53  

Автор вопроса:  Leviofan

Написано несколько процедур сортировки, но нужно узнать какая быстрее работает.

Помогите.

Ответить

  Ответы Всего ответов: 13  

Номер ответа: 1
Автор ответа:
 Justas



ICQ: 259418212 

Вопросов: 24
Ответов: 325
 Web-сайт: justas.newmail.ru
 Профиль | | #1
Добавлено: 18.07.03 06:11

всё просто: Засеки время перед и после цикла, потом отними. Например:

Private Sub Form_Load()
Me.AutoRedraw = True
Print Timer
For i = 0 To 1000000
  'твоя сортировка
Next i
Print Timer
End Sub

Ответить

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



Вопросов: 3
Ответов: 10
 Профиль | | #2 Добавлено: 18.07.03 06:29

Есть одно НО... Поставлю вопрос по другому - цикл (не сортировка) выполняется бесконечно(!) - как быть?

Ответить

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



ICQ: 259418212 

Вопросов: 24
Ответов: 325
 Web-сайт: justas.newmail.ru
 Профиль | | #3
Добавлено: 18.07.03 06:33

"... эк тебя тыркнуло... " (C) кино ДМБ

Дай хоть кусок кода что-ли. А то представить сложно

Ответить

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



Вопросов: 3
Ответов: 10
 Профиль | | #4 Добавлено: 18.07.03 06:42

Грубый пример.

i=1

do until i=2 ' бесконечный цикл

'действие

loop

Прерывается при i=2 (принудительно)

Нужно - скорость выполнения действия (раз/сек).

Ответить

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



ICQ: 259418212 

Вопросов: 24
Ответов: 325
 Web-сайт: justas.newmail.ru
 Профиль | | #5
Добавлено: 18.07.03 06:55

>Нужно - скорость выполнения действия (раз/сек).

ну так и замеряй время до и после выполнения действия.

Ответить

Номер ответа: 6
Автор ответа:
 Leviofan



Вопросов: 3
Ответов: 10
 Профиль | | #6 Добавлено: 18.07.03 07:08

OK!

Ответить

Номер ответа: 7
Автор ответа:
 Leviofan



Вопросов: 3
Ответов: 10
 Профиль | | #7 Добавлено: 18.07.03 07:58

Опять засада!

Вот код-

k = 0

j=50000

For i = 0 To j

iSpeedBegin = Timer

'действие

Form1.Refresh

iSpeed = Timer - iSpeedBegin

k = 1 / iSpeed ' iSpeed--->0 и k ---> деление на ноль :(

Label7.Caption = k & " k/s "

Next i

Как быть?

Ответить

Номер ответа: 8
Автор ответа:
 DimaS



Вопросов: 2
Ответов: 85
 Профиль | | #8 Добавлено: 18.07.03 08:43

Этот код выполнился рактически мгновенно, соответственно iSpeed = Timer - iSpeedBegin получилось равным нулю. Что мешает сделать так:

    k = 0
    j = 50000
    iSpeedBegin = Timer

    For i = 0 To j
        'действие
        Form1.Refresh
        DoEvents
        If Timer - iSpeedBegin > 0 Then
            iSpeedBegin = Timer - iSpeedBegin
            k = 1 / iSpeedBegin
            Label1.Caption = k & " k/s "
            iSpeedBegin = Timer
        End If
    Next i

 

Ответить

Номер ответа: 9
Автор ответа:
 Leviofan



Вопросов: 3
Ответов: 10
 Профиль | | #9 Добавлено: 18.07.03 14:08

Ok... Но мешает то , что я не увижу реальной скорости выполнения программы - ты ограничил ее возможным верхним пределом ... Нужно Реально посчитать скорость (пусть даже она будет 1.000.000 циклов/сек)Как я понял Timer этого не позволяет ....Если только умножать показания таймера на 100000 ....

Кто делал такую фигню- помогите, зачем изобретать велосипед.

Ответить

Номер ответа: 10
Автор ответа:
 NovichoK



Вопросов: 72
Ответов: 147
 Профиль | | #10 Добавлено: 18.07.03 14:41

Private Declare Function GetTickCount Lib "kerne132" () as long

Вчера в книге прочитал! GetTickCount - даетвремя от начала работы Windows в милисекундах! Но я пробовал, лично у меня не находит библиотеку "kerne132". ну попробуй в цикле на форму:

...

lngMS=GetTickCount

print lngMs

...

Ответить

Номер ответа: 11
Автор ответа:
 Иван



Администратор

ICQ: 147688925 

Вопросов: 24
Ответов: 708
 Web-сайт: www.vbnet.ru
 Профиль | | #11
Добавлено: 18.07.03 21:19
kernel32, т.е. с буквой L, а не цифрой 1.

Ответить

Номер ответа: 12
Автор ответа:
 Leviofan



Вопросов: 3
Ответов: 10
 Профиль | | #12 Добавлено: 18.07.03 22:03

Пришел вот к какому варианту -

iVerySpeed = 1

For i = 0 To j - 1

iSpeedBegin = Timer

DoEvents

iSpeedEnd = Timer

If iSpeedEnd - iSpeedBegin > 0 Then

k = (iVerySpeed * 1000) / (Timer - iSpeedBegin) ' интервал в миллисекундах, 'поэтому *1000

Label7.Caption = k & " k/s "

iVerySpeed = 1

Form1.Refresh

Else

iVerySpeed = iVerySpeed + 1 ' кол-во проп. интервалов из-за =0

End If

Next i

Но для удобства - как сделать, чтобы в Label7 значение показывалось с интервалом (а то цифирки бегут...) Через таймер пробовал :( - может руки сильно кривые...

Ответить

Номер ответа: 13
Автор ответа:
 Alex_T



ICQ: 218556518 

Вопросов: 0
Ответов: 1
 Профиль | | #13 Добавлено: 19.07.03 14:57

StartDebug -начало отсчета

EndDebug - конец

В модуль:

Private Declare Function GetTickCount Lib "kernel32" () As Long
Dim sTick As Long, eTick As Long
Enum Times
милисекунды = 1
секунды = 2
минуты = 3
часы = 4
End Enum

Public Sub StartDebug()
sTick = GetTickCount()
End Sub

Public Function EndDebug(ReturnType As Times) As Long
eTick = GetTickCount()
Select Case ReturnType
Case 1
EndDebug = eTick - sTick
Case 2
EndDebug = (eTick - sTick) / 1000
Case 3
EndDebug = (eTick - sTick) / 1000 / 60
Case 4
EndDebug = (eTick - sTick) / 1000 / 60 / 60
End Select
End Function

Ответить

Страница: 1 |

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



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