Иногда имея несколько вариантов выполнения кода пользуюсь следующими замерами для выяснения, какой код будет выполняться быстрее.
Для 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; ЧВН=»);
Возврат ТекСтрока;
КонецФункции
Спасибо автору просто лаконично и доступно вспомнил как это делается повторение как говорится мать учения 🙂
Спасибо. Для 7.7 отличный вариант. Хороший пример для 8-ки без использования «внешних» средств, хоть и измерения с точностью до секунды, что во многих случаях достаточно. Если нужно получать более точные измерения, то можно использовать для замера внешнюю компоненту «НЕТЛЕНКА»http://infostart.ru/public/15589/ , там есть аналог семерочной_getPerformanceCounter()
ЗагрузитьВнешнююКомпоненту(«C:Program Files1cv82commonV8ADD.dll»);
Объект = Новый(«Addin.System»);
Замер = Объект.МиллисекундСоСтарта();
или пользоваться в конфигураторе «Отладка — Замер производительности».
(2) mailrum2004, Спасибо за наводку. Обязательно приму к сведению!
В версии 8.2.17 реализована возможность получения числа миллисекунд, прошедших с 1 января 0001 года, 0:00:00 UTC с помощью функции ТекущаяУниверсальнаяДатаВМиллисекундах()
Спасибо!
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»);
— если обработка или отчёт заведомо менее суток, то так проще 🙂
В типовых свежих:
КлючеваяОперация = «СозданиеФормыКонтактныеЛица»;
ОценкаПроизводительностиКлиентСервер.НачатьЗамерВремени(КлючеваяОперация);