Страница: 1 |
Написано несколько процедур сортировки, но нужно узнать какая быстрее работает. Помогите.
всё просто: Засеки время перед и после цикла, потом отними. Например: Private Sub Form_Load() Есть одно НО... Поставлю вопрос по другому - цикл (не сортировка) выполняется бесконечно(!) - как быть? "... эк тебя тыркнуло... " (C) кино ДМБ Дай хоть кусок кода что-ли. А то представить сложно Грубый пример. i=1 do until i=2 ' бесконечный цикл 'действие loop Прерывается при i=2 (принудительно) Нужно - скорость выполнения действия (раз/сек). >Нужно - скорость выполнения действия (раз/сек). ну так и замеряй время до и после выполнения действия. OK! Опять засада! Вот код- 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 Как быть? Этот код выполнился рактически мгновенно, соответственно iSpeed = Timer - iSpeedBegin получилось равным нулю. Что мешает сделать так: k = 0 For i = 0 To j Ok... Но мешает то , что я не увижу реальной скорости выполнения программы - ты ограничил ее возможным верхним пределом ... Нужно Реально посчитать скорость (пусть даже она будет 1.000.000 циклов/сек)Как я понял Timer этого не позволяет ....Если только умножать показания таймера на 100000 .... Кто делал такую фигню- помогите, зачем изобретать велосипед. Private Declare Function GetTickCount Lib "kerne132" () as long Вчера в книге прочитал! GetTickCount - даетвремя от начала работы Windows в милисекундах! Но я пробовал, лично у меня не находит библиотеку "kerne132". ну попробуй в цикле на форму: ... lngMS=GetTickCount print lngMs ... Пришел вот к какому варианту - 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 значение показывалось с интервалом (а то цифирки бегут...) Через таймер пробовал - может руки сильно кривые... StartDebug -начало отсчета EndDebug - конец В модуль: Private Declare Function GetTickCount Lib "kernel32" () As Long Public Sub StartDebug() Public Function EndDebug(ReturnType As Times) As Long Страница: 1 |
Вопрос: Как узнать, с какой скоростью выполняется цикл ...
Добавлено: 18.07.03 05:53
Автор вопроса: Leviofan
Ответы
Всего ответов: 13
Номер ответа: 1
Автор ответа:
Justas
ICQ: 259418212
Вопросов: 24
Ответов: 325
Web-сайт:
Профиль | | #1
Добавлено: 18.07.03 06:11
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-сайт:
Профиль | | #3
Добавлено: 18.07.03 06:33
Номер ответа: 4
Автор ответа:
Leviofan
Вопросов: 3
Ответов: 10
Профиль | | #4
Добавлено: 18.07.03 06:42
Номер ответа: 5
Автор ответа:
Justas
ICQ: 259418212
Вопросов: 24
Ответов: 325
Web-сайт:
Профиль | | #5
Добавлено: 18.07.03 06:55
Номер ответа: 6
Автор ответа:
Leviofan
Вопросов: 3
Ответов: 10
Профиль | | #6
Добавлено: 18.07.03 07:08
Номер ответа: 7
Автор ответа:
Leviofan
Вопросов: 3
Ответов: 10
Профиль | | #7
Добавлено: 18.07.03 07:58
Номер ответа: 8
Автор ответа:
DimaS
Вопросов: 2
Ответов: 85
Профиль | | #8
Добавлено: 18.07.03 08:43
j = 50000
iSpeedBegin = Timer
'действие
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
Номер ответа: 10
Автор ответа:
NovichoK
Вопросов: 72
Ответов: 147
Профиль | | #10
Добавлено: 18.07.03 14:41
Номер ответа: 11
Автор ответа:
Иван
Администратор
ICQ: 147688925
Вопросов: 24
Ответов: 708
Web-сайт:
Профиль | | #11
Добавлено: 18.07.03 21:19
kernel32, т.е. с буквой L, а не цифрой 1.
Номер ответа: 12
Автор ответа:
Leviofan
Вопросов: 3
Ответов: 10
Профиль | | #12
Добавлено: 18.07.03 22:03
Номер ответа: 13
Автор ответа:
Alex_T
ICQ: 218556518
Вопросов: 0
Ответов: 1
Профиль | | #13
Добавлено: 19.07.03 14:57
Dim sTick As Long, eTick As Long
Enum Times
милисекунды = 1
секунды = 2
минуты = 3
часы = 4
End Enum
sTick = GetTickCount()
End Sub
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