При работе с платформой 1С:Предприятие 7.7 разработчики часто сталкиваются с аномалиями в штатном инструменте «Замер производительности». Одной из самых загадочных проблем являются отрицательные значения в колонках времени или процентов. В этой статье мы подробно разберем, почему возникают такие ошибки, как правильно пользоваться отладчиком для получения достоверных данных и какими программными способами можно измерить скорость выполнения кода с высокой точностью.
Выясним причину, по которой старый добрый отладчик версии 7.7 может показывать «минусы». Проанализируем техническую составляющую платформы. Основных факторов три:
Рассмотрим, как минимизировать вероятность ошибок и получить адекватные цифры, используя стандартный функционал. Чтобы избежать глюков отладчика, рекомендуется придерживаться строгой последовательности действий:
Такой подход исключает попадание в замер лишних интерактивных действий пользователя и инициализации глобальных модулей, что часто и приводит к «кривым» результатам.
Если штатный замер продолжает выдавать некорректные данные или вам нужно узнать точное время выполнения в секундах, воспользуемся системной функцией _GetPerformanceCounter(). Она возвращает количество миллисекунд, прошедших с момента старта операционной системы.
Разберем пример кода для точного измерения:
// Фиксируем время начала
ВремяСтарта = _GetPerformanceCounter();
// Выполняем целевую процедуру
Сформировать();
// Вычисляем разницу и переводим в секунды
ОбщееВремя = (_GetPerformanceCounter() - ВремяСтарта) / 1000;
Сообщить("Процедура выполнена за: " + ОбщееВремя + " сек.");
Важное замечание: помните, что данный счетчик сбрасывается в ноль примерно каждые 49 суток непрерывной работы сервера (из-за ограничения 32-битного типа данных Windows). Если ваш сервер работает месяцами без перезагрузки, учитывайте вероятность перехода через ноль.
Проанализируем ситуацию, когда процедура А вызывает процедуру В. В 1С 7.7 проценты в замере производительности суммируются по всем вызовам функции за весь период замера.
Если в результатах вы видите, что процедура В занимает 88%, а вызвавшая её процедура А — только 87%, это не ошибка. Это означает, что процедура В вызывалась не только из А, но и откуда-то еще. Например:
ОбработкаОжидания.Помните: «Полное время» включает в себя время выполнения всех вложенных вызовов, а «Чистое время» (которое в 7.7 нужно вычислять внимательно) — это только строки кода внутри самой функции.
Выяснив, какие участки кода тормозят, рассмотрим способы их ускорения, специфичные для версии 7.7:
Периодический. Это может дать выигрыш в скорости около 25–30%.
// Плохо:
Пока ... Цикл
Текст = СоздатьОбъект("Текст");
// действия
КонецЦикла;
// Хорошо:
Текст = СоздатьОбъект("Текст");
Пока ... Цикл
// действия (например, Текст.Очистить() и использование)
КонецЦикла;
СоздатьОбъект за пределы цикла существенно экономит время на выделение памяти.
Состояние() на каждой итерации цикла — один из главных «пожирателей» времени. Выводите состояние только каждую 100-ю или 1000-ю итерацию.Таким образом, мы рассмотрели основные проблемы замера производительности в 1С 7.7 и способы их решения. Используйте программные методы замера для точности и соблюдайте правила работы с отладчиком для минимизации искажений.