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

21.11.11

Разработка - Универсальные функции

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

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

Для 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; ЧВН=");

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

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

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    4460    Abysswalker    11    

46

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

Порой необходимо временно отключить расширение 1С, не удаляя его, чтобы не потерять данные. Но в этом случае при каждом запуске всем будет лезть уведомление о неактивном расширении, хотя очевидно, это техническая информация, которой не стоит лишний раз пугать пользователей.

14.05.2025    8250    DeerCven    15    

62

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    55037    dimanich70    84    

174

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    7859    7    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    69706    atdonya    31    

72

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    9830    ke.92@mail.ru    17    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. xklos 06.01.12 07:43 Сейчас в теме
Спасибо автору просто лаконично и доступно вспомнил как это делается повторение как говорится мать учения :)
2. solontsov 1 08.11.12 14:43 Сейчас в теме
Спасибо. Для 7.7 отличный вариант. Хороший пример для 8-ки без использования "внешних" средств, хоть и измерения с точностью до секунды, что во многих случаях достаточно. Если нужно получать более точные измерения, то можно использовать для замера внешнюю компоненту "НЕТЛЕНКА" http://infostart.ru/public/15589/, там есть аналог семерочной_getPerformanceCounter()

ЗагрузитьВнешнююКомпоненту("C:\Program Files\1cv82\common\V8ADD.dll");
Объект = Новый("Addin.System");
Замер = Объект.МиллисекундСоСтарта();

или пользоваться в конфигураторе "Отладка - Замер производительности".
susorov; ReLock; +2 Ответить
3. ReLock 39 09.11.12 11:41 Сейчас в теме
(2) mailrum2004, Спасибо за наводку. Обязательно приму к сведению!
4. solontsov 1 23.04.13 15:44 Сейчас в теме
В версии 8.2.17 реализована возможность получения числа миллисекунд, прошедших с 1 января 0001 года, 0:00:00 UTC с помощью функции ТекущаяУниверсальнаяДатаВМиллисекундах()
fuser; GV.; KAV2; +3 Ответить
5. susorov 94 06.05.13 15:03 Сейчас в теме
Спасибо!
В инете ( 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");
- если обработка или отчёт заведомо менее суток, то так проще :)
Borey; adm1nb3k; loviga; _Sedoy; nysysimara; JonathanP; Dvornik; ixilimuse; +8 Ответить
6. maXon777 129 10.10.19 17:02 Сейчас в теме
В типовых свежих:
КлючеваяОперация = "СозданиеФормыКонтактныеЛица";
ОценкаПроизводительностиКлиентСервер.НачатьЗамерВремени(КлючеваяОперация);
Светлый ум; +1 Ответить
Для отправки сообщения требуется регистрация/авторизация