Документация Engee
Notebook

Оценка времени исполнения моделей в Engee

В данном примере мы разберём возможности сравнения моделей по скорости работы.

Для демонстрации возьмём две одинаковые модели с идентичными параметрами. Отличие одно: в первом случае будут применяться конвейерные вычисления, а во втором – векторные.

Сами модели представлены на рисунке ниже.

image_4.png

image_5.png

Функция для запуска модели

In [ ]:
# Подключение вспомогательной функции запуска модели.
function run_model( name_model)
    
    Path = (@__DIR__) * "/" * name_model * ".engee"
    
    if name_model in [m.name for m in engee.get_all_models()] # Проверка условия загрузки модели в ядро
        model = engee.open( name_model ) # Открыть модель
        model_output = engee.run( model, verbose=true ); # Запустить модель
    else
        model = engee.load( Path, force=true ) # Загрузить модель
        model_output = engee.run( model, verbose=true ); # Запустить модель
        engee.close( name_model, force=true ); # Закрыть модель
    end
    sleep(5)
    return model_output
end
Out[0]:
run_model (generic function with 1 method)

Сравнение скорости работы

Теперь перейдём к сравнению скорости работы. Воспользуемся библиотекой TickTock и функциями tick() и tok()

tick() — записывает текущий момент времени. Обычно используется для начала измерения времени. tok() — вычисляет и выводит время, прошедшее с последнего вызова tick().

Особенности и преимущества использования TickTock:

  1. Функции tick() и tok() обеспечивают простой и интуитивно понятный способ измерения времени без необходимости вручную вычислять разницу между временем начала и окончания.
  2. TickTock работает с высокой точностью времени, что позволяет получать достоверные данные о продолжительности выполнения кода даже для очень быстрых операций.
  3. Результат измерений выводится в удобном для восприятия формате (секунды, миллисекунды), а также формат данных выхода стандартный Float64, что позволяет легко перевести эти значения в минуты или часы.
In [ ]:
using TickTock
In [ ]:
tick()
run_model("sin_Sample") # Запуск модели.
Ts = tok()
Out[0]:
7.545560097
In [ ]:
tick()
run_model("sin_Frame") # Запуск модели.
Tf = tok()
Out[0]:
7.903039812
In [ ]:
println("Time sin_Sample: $(Ts)")
println("Time sin_Frame: $(Tf)")
println("Time difference: $(abs(Ts-Tf))")
Time sin_Sample: 7.545560097
Time sin_Frame: 7.903039812
Time difference: 0.3574797150000002

Как мы видим из расчёта разницы, время выполнения отличается незначительно. Также сравним результаты моделирования, дабы окончательно убедиться в идентичности моделей.

In [ ]:
Ss = collect(Ss);
Sf = collect(Sf);
Sf = reduce(vcat, Sf.value)

println("Size sin_Sample: $(size(Ss))")
println("Size sin_Frame: $(size(Ss))")
Size sin_Sample: (10001, 2)
Size sin_Frame: (10001, 2)

Как мы видим, размерности сигналов равны.

In [ ]:
gr()
error = abs.(Sf[1:100]-Ss.value[1:100]);

plot(Ss.value[1:100], label="sin_Sample")
plot!(Sf[1:100], label="sin_Frame")
plot!(error, label="difference")
title!("sum_error: $(sum(error))")
Out[0]:

Сигналы идентичные и по размерам, и по результатам сравнения самих сигналов.

Вывод

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

Блоки, использованные в примере