При оптимизации и отладке кода часто возникает необходимость точно измерить, сколько времени выполняется тот или иной его фрагмент. Нам нужна точность до миллисекунд, чтобы оценить производительность и найти «узкие» места в алгоритме. Проанализируем, как решить эту задачу в 1С, аналогично тому, как это делается в других языках программирования, например, с помощью System.currentTimeMillis() в Java.
В платформе 1С:Предприятие 8 есть несколько подходов для замера времени. Рассмотрим два основных метода: низкоуровневый с использованием встроенной функции и более высокоуровневый, рекомендованный фирмой «1С» при использовании «Библиотеки стандартных подсистем» (БСП).
Это самый прямой и универсальный способ, который будет работать в любой конфигурации, даже самописной, так как он встроен в саму платформу. Разберем его по шагам.
Шаг 1. Понимаем, что возвращает функция
На первый взгляд, название функции ТекущаяУниверсальнаяДатаВМиллисекундах() может ввести в заблуждение. Кажется, что она должна возвращать количество миллисекунд текущего дня. Однако это не так. Эта функция возвращает общее количество миллисекунд, прошедших с начала эры — с 1 января 0001 года 00:00:00. Именно поэтому при ее вызове мы видим очень большое число.
Для нашей задачи — замера производительности — это именно то, что нужно. Нам не важна абсолютная дата, нам важна разница между двумя моментами времени.
Шаг 2. Реализуем замер времени
Алгоритм замера предельно прост:
Посмотрим на практический пример кода:
// 1. Фиксируем время начала операции
НачалоЗамера = ТекущаяУниверсальнаяДатаВМиллисекундах();
// 2. Здесь находится ваш код, производительность которого нужно измерить
// Например, выполнение сложного цикла или запроса
Для сч = 1 По 100000 Цикл
// Какие-то действия
КонецЦикла;
// 3. Фиксируем время окончания операции
КонецЗамера = ТекущаяУниверсальнаяДатаВМиллисекундах();
// 4. Рассчитываем и выводим результат
ДлительностьВМиллисекундах = КонецЗамера - НачалоЗамера;
Сообщить("Время выполнения кода: " + ДлительностьВМиллисекундах + " мс.");
Этот метод очень удобен своей простотой и отсутствием зависимостей от каких-либо библиотек. Он идеально подходит для быстрых замеров в любой конфигурации. Для интерактивного тестирования и замера производительности таких алгоритмов можно использовать консоль кода для управляемых форм с поддержкой объявления методов.
Шаг 3. Создаем удобную обертку (необязательно)
Если вам часто приходится измерять время, можно создать небольшую вспомогательную функцию, которая будет возвращать текущее время в виде числа с дробной частью, где целая часть — секунды, а дробная — миллисекунды. Это может быть удобнее для восприятия.
&НаСервереБезКонтекста
Функция ПолучитьВремяВДробныхСекундах()
// Получаем общее количество миллисекунд с 01.01.0001
Миллисекунды = ТекущаяУниверсальнаяДатаВМиллисекундах();
// Вычисляем количество секунд (целочисленное деление)
Секунды = Цел(Миллисекунды / 1000);
// Вычисляем оставшиеся миллисекунды (остаток от деления)
ОстатокМиллисекунд = Миллисекунды % 1000;
// Формируем итоговое число
Результат = Секунды + (ОстатокМиллисекунд / 1000);
Возврат Результат;
КонецФункции
// Пример использования обертки
Начало = ПолучитьВремяВДробныхСекундах();
// ... Ваш код ...
Конец = ПолучитьВремяВДробныхСекундах();
Длительность = Конец - Начало;
Сообщить("Время выполнения: " + Формат(Длительность, "ЧДЦ=3") + " сек.");
Если ваша конфигурация разработана на основе «Библиотеки стандартных подсистем» (БСП), то фирма «1С» рекомендует использовать специальный инструментарий для замеров производительности. Это более структурированный и функциональный подход.
Что такое `ЗамерВремени`?
ЗамерВремени — это объект общего модуля ЗамерыВремени, который предоставляет удобный интерфейс для выполнения одного или нескольких замеров времени. Он инкапсулирует логику, описанную в первом решении, и добавляет новые возможности, например, выполнение серии замеров и расчет среднего значения.
Как использовать `ЗамерВремени`?
Рассмотрим основной сценарий использования.
ЗамерыВремени.НачатьЗамер(). Эта функция сразу же фиксирует время старта.ЗакончитьЗамер(). Этот метод вернет длительность выполнения в секундах (число с дробной частью).Посмотрим на пример кода:
// 1. Начинаем замер. Внутри этого метода уже зафиксировалось время старта.
МойЗамер = ЗамерыВремени.НачатьЗамер();
// 2. Код, который мы измеряем
Для сч = 1 По 100000 Цикл
// Какие-то действия
КонецЦикла;
// 3. Заканчиваем замер и получаем длительность в секундах
ДлительностьВСЕкундах = МойЗамер.ЗакончитьЗамер();
// 4. Выводим результат
Сообщить("Время выполнения кода: " + ДлительностьВСЕкундах + " сек.");
// Если нужны миллисекунды, просто умножаем на 1000
ДлительностьВМиллисекундах = ДлительностьВСЕкундах * 1000;
Сообщить("Время выполнения кода: " + ДлительностьВМиллисекундах + " мс.");
Преимущества использования `ЗамерВремени` из БСП:
Выбор метода зависит от вашей задачи и контекста разработки.
ТекущаяУниверсальнаяДатаВМиллисекундах(). Это надежный и универсальный платформенный механизм.ЗамерВремени из общего модуля ЗамерыВремени. Это рекомендуемый и более профессиональный способ.В обоих случаях вы сможете с высокой точностью определить время выполнения критически важных участков кода и эффективно оптимизировать работу вашей системы.