Замер времени выполнения кода

Замер времени выполнения кода

Иногда имея несколько вариантов выполнения кода пользуюсь следующими замерами для выяснения, какой код будет выполняться быстрее. 

Для 7.7:

//В глобальном модуле:

Перем глТЗамер;

//*****************************************************************************

Процедура глТНачатьЗамер() Экспорт //++ ReLock (19.10.2005)

      глТЗамер.ДобавитьЗначение(_GetPerformanceCounter());

КонецПроцедуры

 

//*****************************************************************************

Функция глТЗакончитьЗамер() Экспорт //++ ReLock (19.10.2005)

      КонВремя = _GetPerformanceCounter();

      КонДни = 0;

      КонЧасы = 0;

      КонМинуты = 0;

      КонСекунды = 0;

      КонМиллиСек = 0;

      КолЗамеров = глТЗамер.РазмерСписка();

      Если КолЗамеров = 0 Тогда

      // Раз нет стартовой даты — значит процедура начала отсчета времени не была запущена.

            Возврат «Замер времени не начат!»;

      КонецЕсли;

      ОстатокВремени = КонВремя глТЗамер.ПолучитьЗначение(КолЗамеров);

      КонДни = Цел(ОстатокВремени / 86400000); //++ 86400000 — Количество миллисекунд в сутках

      ОстатокВремени = ОстатокВремени КонДни * 86400000;

      КонЧасы = Цел(ОстатокВремени / 3600000); //++ 3600000 — Количество миллисекунд в часе

      ОстатокВремени = ОстатокВремени КонЧасы * 3600000;

      КонМинуты = Цел(ОстатокВремени / 60000); //++ 60000 — Количество миллисекунд в минуте

      ОстатокВремени = ОстатокВремени КонМинуты * 60000;

      КонСекунды = Цел(ОстатокВремени / 1000); //++ 1000 — Количество миллисекунд в секунде

      ОстатокВремени = ОстатокВремени КонСекунды * 1000;

      КонМиллисек = ОстатокВремени;

      ТекСтрока = Строка(КонДни) + «/» + Формат(КонЧасы,«Ч(0)2») + «:» + Формат(КонМинуты,«Ч(0)2»

+ «:» + Формат(КонСекунды,«Ч(0)2») + «.»       + Формат(КонМиллиСек,«Ч(0)3»);

      глТЗамер.УдалитьЗначение(КолЗамеров);

      Возврат ТекСтрока;

КонецФункции


//В процедуре ПриНачалеРаботыСистемы:

глТЗамер = СоздатьОбъект(«СписокЗначений»);

 

//Пример выполнения:

глТНачатьЗамер();

//… некоторый кусок кода для замера…

Сообщить(«Время выполнения: «+глТЗакончитьЗамер()) ;

 

 

 

Для 8.2:

 

&НаКлиенте

Перем Замер;

&НаКлиенте

Процедура НачатьЗамер()

    Замер = ТекущаяДата();

КонецПроцедуры

&НаКлиенте

Функция ЗакончитьЗамер()

    КонВремя = ТекущаяДата();

    КонДни      = 0;

    КонЧасы     = 0;

    КонМинуты   = 0;

    КонСекунды = 0;

    Если ПустаяСтрока(Замер) Тогда

        // Раз нет стартовой даты — значит процедура начала отсчета времени не была запущена.

        Возврат «Замер времени не начат!»;

    КонецЕсли;

    ОстатокВремени = КонВремя Замер;

    КонДни          = Цел(ОстатокВремени / 86400); //++ 86400 — Количество секунд в сутках

    ОстатокВремени = ОстатокВремени КонДни * 86400;

    КонЧасы         = Цел(ОстатокВремени / 3600); //++ 3600 — Количество секунд в часе

    ОстатокВремени  = ОстатокВремени КонЧасы * 3600;

    КонМинуты       = Цел(ОстатокВремени / 60); //++ 60 — Количество секунд в минуте

    ОстатокВремени  = ОстатокВремени КонМинуты * 60;

    КонСекунды      = ОстатокВремени;

    ТекСтрока       = Формат(КонДни,«ЧН=2; ЧН=0; ЧВН=») + «/» + Формат(КонЧасы,«ЧЦ=2; ЧН=0; ЧВН=») + «:» 

+ Формат(КонМинуты,«ЧЦ=2; ЧН=0; ЧВН=») + «:» + Формат(КонСекунды,«ЧЦ=2; ЧН=0; ЧВН=»);

    Возврат ТекСтрока;

КонецФункции

6 Comments

  1. xklos

    Спасибо автору просто лаконично и доступно вспомнил как это делается повторение как говорится мать учения 🙂

    Reply
  2. mailrum2004

    Спасибо. Для 7.7 отличный вариант. Хороший пример для 8-ки без использования «внешних» средств, хоть и измерения с точностью до секунды, что во многих случаях достаточно. Если нужно получать более точные измерения, то можно использовать для замера внешнюю компоненту «НЕТЛЕНКА» http://infostart.ru/public/15589/, там есть аналог семерочной_getPerformanceCounter()

    ЗагрузитьВнешнююКомпоненту(«C:Program Files1cv82commonV8ADD.dll»);

    Объект = Новый(«Addin.System»);

    Замер = Объект.МиллисекундСоСтарта();

    или пользоваться в конфигураторе «Отладка — Замер производительности».

    Reply
  3. ReLock

    (2) mailrum2004, Спасибо за наводку. Обязательно приму к сведению!

    Reply
  4. mailrum2004

    В версии 8.2.17 реализована возможность получения числа миллисекунд, прошедших с 1 января 0001 года, 0:00:00 UTC с помощью функции ТекущаяУниверсальнаяДатаВМиллисекундах()

    Reply
  5. susorov

    Спасибо!

    В инете ( http://help1c.com/faq/view/362.html ) приведён довольно простой вариант «Как показать период времени…», но пришлось его уточнить, добавить «-0.5». Поэтому работает такой:

    ВремяСтарта = ТекущаяДата(); // … Далее выполняется нужная обработка …

    ЗатраченоСекунд = ТекущаяДата() — ВремяСтарта;

    Час_Мин_Сек = Строка(Формат(ЗатраченоСекунд/3600-0.5,»ЧЦ=2;ЧН=;ЧВН=») + «:»

    + Формат(ЗатраченоСекунд%3600/60-0.5,»ЧЦ=2;ЧН=;ЧВН=») + «:»

    + Формат(ЗатраченоСекунд%60,»ЧЦ=2;ЧН=;ЧВН=»)); // Если ЗатраченоСекунд = 3723, то Час_Мин_Сек = «01:02:03»

    … но сейчас использую такой вариант:

    Час_Мин_Сек = Формат(‘00010101’+ЗатраченоСекунд, «ДФ=HH:mm:ss»);

    — если обработка или отчёт заведомо менее суток, то так проще 🙂

    Reply
  6. maXon777

    В типовых свежих:

    КлючеваяОперация = «СозданиеФормыКонтактныеЛица»;

    ОценкаПроизводительностиКлиентСервер.НачатьЗамерВремени(КлючеваяОперация);

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *