Иногда бывает необходимо оценить время выполнения функций в ваших сценариях, когда вы замечаете, что виджет или процесс отрабатывают с задержками. Ниже описаны способы логирования для Клиентских и Серверных сценариев.
Клиентские сценарии.
В Клиентских сценариях у нас есть доступ к браузерным API, поэтому мы воспользуемся тремя встроенными методами:
- console.time()
- console.timeEnd()
- console.timeLog()
(https://developer.mozilla.org/ru/docs/Web/API/Console/time)
Декларируйте в самом начале Клиентского сценария:
declare const console:any;
Перед вызовом функции, время которой вы хотите залогировать, вызываем метод console.time(‘<label>’), где label - название таймера (вы можете использовать название функции). После вызова функции - методы console.timeEnd(‘<label>’) и сonsole.timeLog(‘<label>’).
В консоли вы увидите следующее:
Серверные сценарии.
Приведу способ, с помощью которого вы сможете залогировать время выполнения функций как в ваших Клиентских сценариях, так и в Серверных.
Для начала вам необходимо создать в контексте 3 переменных:
Далее объявите в сценариях следующие методы:
Код:
function setLoggerInitialZero(){
Context.data.time_log = ''
Context.data.initial_logging_time = (new Date()).getTime();
}
Метод устанавливает общую начальную точку отсчета
Код:
function setLoggerIterationZero(){
Context.data.intermediate_logging_time = (new Date()).getTime();
}
Метод устанавливает промежуточную точку отсчета.
Код:
function writeDurationToLog(funcName:string){
const timeNow = (new Date()).getTime()
const funcTime = (timeNow - Context.data.intermediate_logging_time!)/1000;
const commonTime = (timeNow - Context.data.initial_logging_time!)/1000;
Context.data.time_log += `${funcName} - функция длилась ${funcTime}c, с момента запуска ${commonTime}c; \n`
}
Метод записывает в Context.data.time_log результаты логирования функции. На вход принимает строку с именем функции, для вычислений использует точки отсчета.
Перед вызовом функции, время выполнения которой вы хотите залогировать, вам необходимо произвести вызов метода setLoggerInitialZero (вызывается только один раз в начале) и setLoggerIterationZero (вызывается перед каждой функцией), а сразу после вызова функции - метод writeDurationToLog(‘funcName’), где funcName - название функции.
Данный методы можно вызывать столько раз, сколько вам потребуется, однако, необходимо учитывать что вызовы setLoggerIterationZero() и writeDurationToLog() необходимо делать последовательно, друг за другом. Залогировать время выполнения функции, внутри которой вы также вызываете описанные выше методы не получиться.
Далее вы можете использовать Context.data.time_log для вывода в консоль либо для просмотра в Мониторе процессов.
Разберем несколько примеров.
Вам необходимо выяснить, сколько времени выполнялся серверный сценарий - поступаем так:
Вам необходимо “залезть” внутрь Серверного скрипта и разобрать его по полочкам - объявляем все 3 метода также и в Серверном сценарии, в Клиентском сценарии оставляет такой код:
В Серверном сценарии оборачиваем каждый метод в setLoggerIterationZero()/ writeDurationToLog():
В консоли вы сможете увидеть что-то подобное: