Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.05.2009, 14:30   #1
nikolai_P
Форумчанин Подтвердите свой е-майл
 
Регистрация: 28.04.2008
Сообщений: 116
По умолчанию Время выполнения макроса...

Поделитесь опытом, кто как анализирует время выполнения макроса!
Желательно с точностью до сотых)
nikolai_P вне форума Ответить с цитированием
Старый 18.05.2009, 15:17   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Код:
Sub test()
    t = Timer
    For i = 1 To 30000000: Next
    MsgBox "Обработка данных продолжалась  " & Timer - t & " сек.", vbInformation
End Sub
EducatedFool вне форума Ответить с цитированием
Старый 18.05.2009, 15:29   #3
nikolai_P
Форумчанин Подтвердите свой е-майл
 
Регистрация: 28.04.2008
Сообщений: 116
По умолчанию

Спасибо
nikolai_P вне форума Ответить с цитированием
Старый 18.05.2009, 15:55   #4
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Если нужно уж совсем точно, то можно воспользоваться функциями API
Код:
Option Explicit

Public Declare Function timeGetTime Lib "winmm.dll" () As Long
Public Declare Function timeBeginPeriod Lib "winmm.dll" (ByVal uPeriod As Long) As Long
Public Declare Function timeEndPeriod Lib "winmm.dll" (ByVal uPeriod As Long) As Long
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub test()
  Dim tm As Long, tmu As Long, i As Long
  timeBeginPeriod 1 'Включаем отсчет времени
  Sleep 20
  tm = timeGetTime 'Запоминаем начальный момент
'Блок с нашими вычислениями
'--------------------------------------------------------
  For i = 1 To 300000000: Next i
'--------------------------------------------------------
  tmu = timeGetTime - tm 'Фиксируем разницу времени
  timeEndPeriod 1 'Выключаем отсчет времени
  MsgBox tmu / 1000 'Выводим результат измерения времени в секундах
End Sub
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 18.05.2009, 16:04   #5
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию 2 viter.alex

Цитата:
Сообщение от viter.alex Посмотреть сообщение
Если нужно уж совсем точно, то можно воспользоваться функциями API
А что, в моём варианте получается менее точно?

Возьмём, для примера, такие варианты макросов:
Код:
Public Declare Function timeGetTime Lib "winmm.dll" () As Long
Public Declare Function timeBeginPeriod Lib "winmm.dll" (ByVal uPeriod As Long) As Long
Public Declare Function timeEndPeriod Lib "winmm.dll" (ByVal uPeriod As Long) As Long
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub test()
  Dim tm As Long, tmu As Long
  timeBeginPeriod 1 'Включаем отсчет времени
  Sleep 20
  tm = timeGetTime 'Запоминаем начальный момент
  For i = 1 To 30000000: Next i
  tmu = timeGetTime - tm 'Фиксируем разницу времени
  timeEndPeriod 1 'Выключаем отсчет времени
  Debug.Print tmu / 1000  'Выводим результат измерения времени в секундах
End Sub

Sub test2()
    t = Timer
    For i = 1 To 30000000: Next
    Debug.Print Timer - t
End Sub
Твой код выдаёт 0,446
а мой - 0,453125

Смысл использовать WinAPI ?
EducatedFool вне форума Ответить с цитированием
Старый 18.05.2009, 16:47   #6
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
…Смысл использовать WinAPI ?
Функция Timer работает только в пределах суток, т.к. выдает количество миллисекунд, прошедших с полуночи. API считает в процессорных тиках, поэтому заведомо точнее и независимее.
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 18.05.2009, 17:24   #7
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию

Проверил
EducatedFool 0,300713 сек
viter.alex 2,151
Кому верить?
valerij вне форума Ответить с цитированием
Старый 19.05.2009, 07:25   #8
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Чтобы не допустить возникновения возможной ошибки при работе макроса в момент перехода через 0 часов, действительно, лучше использовать API-функцию. Только, можно чуть проще:
Код:
Private Declare Function GetTickCount Lib "kernel32" () As Long
Sub test3()
    t = GetTickCount
    For i = 1 To 30000000: Next
    MsgBox "Обработка данных продолжалась  " & (GetTickCount - t) / 1000 & " сек.", vbInformation
End Sub
А спорить о том, какая из миллисекунд точнее, по-моему, неправильно.
valerij А Вы попробуйте один и тот же тест (любой) запустить несколько раз... и сравните результаты.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 03.04.2013, 00:32   #9
Intelligio
Новичок
Джуниор
 
Регистрация: 01.11.2011
Сообщений: 1
По умолчанию

SAS888 для x64 не подходит(
может кто еще предложить?
Intelligio вне форума Ответить с цитированием
Старый 03.04.2013, 00:59   #10
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Вот тема, где недавно сравнивали разные таймеры: http://planetaexcel.ru/forum/index.p...336&MID=385420

Intelligio, а Вам в поиск по PtrSafe.
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как отключить отображение изменений во время выполнения макроса? AnnNet Microsoft Office Excel 1 15.04.2009 14:43
Цикл, время выполнения шага KiDoki Общие вопросы Delphi 9 19.12.2008 22:37
скрыть процесс выполнения макроса Iskin Microsoft Office Excel 1 21.11.2008 07:28
Выполнения макроса(с подстановкой имени) при условии ячейки... MaxZoa Microsoft Office Excel 7 22.04.2008 11:08
Как замерить время выполнения программы Gracel Общие вопросы Delphi 5 12.06.2007 22:16