...

Логирование времени выполнения сценариев

Тема в разделе "Примеры сценариев", создана пользователем f.nikolaev, 6 сен 2022.

  1. f.nikolaev

    f.nikolaev Участник

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


    Клиентские сценарии.

    В Клиентских сценариях у нас есть доступ к браузерным 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>’).

    [​IMG]

    В консоли вы увидите следующее:

    [​IMG]




    Серверные сценарии.

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


    Для начала вам необходимо создать в контексте 3 переменных:

    upload_2022-9-6_16-54-41.png



    Далее объявите в сценариях следующие методы:

    Код:
    
    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 для вывода в консоль либо для просмотра в Мониторе процессов.


    Разберем несколько примеров.

    Вам необходимо выяснить, сколько времени выполнялся серверный сценарий - поступаем так:

    [​IMG]


    Вам необходимо “залезть” внутрь Серверного скрипта и разобрать его по полочкам - объявляем все 3 метода также и в Серверном сценарии, в Клиентском сценарии оставляет такой код:

    [​IMG]

    В Серверном сценарии оборачиваем каждый метод в setLoggerIterationZero()/ writeDurationToLog():

    [​IMG]


    В консоли вы сможете увидеть что-то подобное:

    [​IMG]