Как в 1С измерить время выполнения кода в миллисекундах?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

В платформе 1С:Предприятие 8 есть несколько подходов для замера времени. Рассмотрим два основных метода: низкоуровневый с использованием встроенной функции и более высокоуровневый, рекомендованный фирмой «1С» при использовании «Библиотеки стандартных подсистем» (БСП).

Решение 1: Использование функции `ТекущаяУниверсальнаяДатаВМиллисекундах()`

Это самый прямой и универсальный способ, который будет работать в любой конфигурации, даже самописной, так как он встроен в саму платформу. Разберем его по шагам.

Шаг 1. Понимаем, что возвращает функция

На первый взгляд, название функции ТекущаяУниверсальнаяДатаВМиллисекундах() может ввести в заблуждение. Кажется, что она должна возвращать количество миллисекунд текущего дня. Однако это не так. Эта функция возвращает общее количество миллисекунд, прошедших с начала эры — с 1 января 0001 года 00:00:00. Именно поэтому при ее вызове мы видим очень большое число.

Для нашей задачи — замера производительности — это именно то, что нужно. Нам не важна абсолютная дата, нам важна разница между двумя моментами времени.

Шаг 2. Реализуем замер времени

Алгоритм замера предельно прост:

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

Посмотрим на практический пример кода:


// 1. Фиксируем время начала операции
НачалоЗамера = ТекущаяУниверсальнаяДатаВМиллисекундах();

// 2. Здесь находится ваш код, производительность которого нужно измерить
// Например, выполнение сложного цикла или запроса
Для сч = 1 По 100000 Цикл
    // Какие-то действия
КонецЦикла;

// 3. Фиксируем время окончания операции
КонецЗамера = ТекущаяУниверсальнаяДатаВМиллисекундах();

// 4. Рассчитываем и выводим результат
ДлительностьВМиллисекундах = КонецЗамера - НачалоЗамера;
Сообщить("Время выполнения кода: " + ДлительностьВМиллисекундах + " мс.");

Этот метод очень удобен своей простотой и отсутствием зависимостей от каких-либо библиотек. Он идеально подходит для быстрых замеров в любой конфигурации. Для интерактивного тестирования и замера производительности таких алгоритмов можно использовать консоль кода для управляемых форм с поддержкой объявления методов.

Шаг 3. Создаем удобную обертку (необязательно)

Если вам часто приходится измерять время, можно создать небольшую вспомогательную функцию, которая будет возвращать текущее время в виде числа с дробной частью, где целая часть — секунды, а дробная — миллисекунды. Это может быть удобнее для восприятия.


&НаСервереБезКонтекста
Функция ПолучитьВремяВДробныхСекундах()

    // Получаем общее количество миллисекунд с 01.01.0001
    Миллисекунды = ТекущаяУниверсальнаяДатаВМиллисекундах();
    
    // Вычисляем количество секунд (целочисленное деление)
    Секунды = Цел(Миллисекунды / 1000);
    
    // Вычисляем оставшиеся миллисекунды (остаток от деления)
    ОстатокМиллисекунд = Миллисекунды % 1000;
    
    // Формируем итоговое число
    Результат = Секунды + (ОстатокМиллисекунд / 1000);
    
    Возврат Результат;

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

// Пример использования обертки
Начало = ПолучитьВремяВДробныхСекундах();
// ... Ваш код ...
Конец = ПолучитьВремяВДробныхСекундах();
Длительность = Конец - Начало;
Сообщить("Время выполнения: " + Формат(Длительность, "ЧДЦ=3") + " сек.");

Решение 2: Использование объекта `ЗамерВремени` из БСП

Если ваша конфигурация разработана на основе «Библиотеки стандартных подсистем» (БСП), то фирма «1С» рекомендует использовать специальный инструментарий для замеров производительности. Это более структурированный и функциональный подход.

Что такое `ЗамерВремени`?

ЗамерВремени — это объект общего модуля ЗамерыВремени, который предоставляет удобный интерфейс для выполнения одного или нескольких замеров времени. Он инкапсулирует логику, описанную в первом решении, и добавляет новые возможности, например, выполнение серии замеров и расчет среднего значения.

Как использовать `ЗамерВремени`?

Рассмотрим основной сценарий использования.

  1. Создание замера. Сначала нужно создать новый экземпляр объекта через функцию ЗамерыВремени.НачатьЗамер(). Эта функция сразу же фиксирует время старта.
  2. Остановка замера. После выполнения кода нужно остановить замер, вызвав метод ЗакончитьЗамер(). Этот метод вернет длительность выполнения в секундах (число с дробной частью).
  3. Анализ результата. Полученное значение можно использовать для дальнейшего анализа.

Посмотрим на пример кода:


// 1. Начинаем замер. Внутри этого метода уже зафиксировалось время старта.
МойЗамер = ЗамерыВремени.НачатьЗамер();

// 2. Код, который мы измеряем
Для сч = 1 По 100000 Цикл
    // Какие-то действия
КонецЦикла;

// 3. Заканчиваем замер и получаем длительность в секундах
ДлительностьВСЕкундах = МойЗамер.ЗакончитьЗамер();

// 4. Выводим результат
Сообщить("Время выполнения кода: " + ДлительностьВСЕкундах + " сек.");

// Если нужны миллисекунды, просто умножаем на 1000
ДлительностьВМиллисекундах = ДлительностьВСЕкундах * 1000;
Сообщить("Время выполнения кода: " + ДлительностьВМиллисекундах + " мс.");

Преимущества использования `ЗамерВремени` из БСП:

Итоги: что выбрать?

Выбор метода зависит от вашей задачи и контекста разработки.

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

← На главную