Работа колбеков

Страницы: 1
RSS
Работа колбеков
 
Просто наблюдение. Пока не могу подтвердить реальным тестом.

В последних версиях терминала, по ощущениям начиная с 12-ой, наличие колбека в скрипте стало ощутимо "тормозить" терминал.
Естественно и раннее колбек использовался только для передачи в очередь. Но теперь даже это приводит к периодическим замираниям терминала.
Особенно если у скрипта есть и окно со своим колбеком на обновление.

Наблюдаю у разных брокеров. Есть те, у кого это, можно сказать, постоянно. А есть те, у кого это только в периоды повышенной ликвидности.

Сильнее это проявляется если запустить несколько скриптов и даже в спокойное время. При этом на демо Quik Junior, где поток данных очевидно низкий, это малозаметно.

Хотелось бы понять - это у меня что-то вылезло и надо глубоко копать или такое есть и других.

Примечательно, что есть скрипт из одной строки запускающий dll реализующий jRPC сервер из Квика на плюсах. И если подписаться в нём на OnQuote, то происходит то же самое. Казалось бы - библиотека на ++, нет окон - а терминал не даёт переключить закладки, думает.
 
Ок. Сделал нагрузочный тест https://disk.360.yandex.ru/d/P7xB_poL0QlKfAВерсия терминала 13.02.20. Реальный брокер.

Создаётся простая таблица. По списку (всего 7) инструментов выводятся данные.

Чтобы была какая-то нагрузка, то берем два колбека OnParam и OnQuote. Данные в таблицу выводятся только из main. В колбеке OnParam вызывается getParamEx несколько раз (нагрузка же).

OnQuote только для записи флага. Чтение DOM тоже в main.

Чтобы хоть как-то смоделировать реальный скрипт, созданы библиотеки заглушки с большим число функций. В main вызывается по одной функции из них.

В итоге скрипт занимает примерно 1 мб. Что не так и много.

Запускаю на реальном брокере  и терминал "умирает". Не совсем, но уже ощутимо видно как таблица текущих торгов, да и весь интерфейс, перестаёт работать "плавно".
В таблице данные выводятся с задержками, приходится "пинать окно" (вспоминаем тему https://forum.quik.ru/messages/forum10/message49120/topic3777/#message49120)

Также на этом примере можно увидеть (по крайней мере у меня), что если не подключать большие библиотеки, то уже всё заметно живее. Т.е. банальный размер скрипта влияет.

При этом в более старых версиях терминала не замечалось особого влияния размера скрипта на работу.
 
можете сделать вывод времени входа и выхода для колбеков и для  main  c помощью точного счетчик Windows?
 
Давно эта тема обсуждалась, ещё в 9-й версии.
Оценить оверхэд от колбэков можно на следующих скриптах:
Код
local run = true
function OnStop()
  run = nil
end

function main()
  local n = getNumberOf("all_trades")
  local m = n
  message("Num all trades: " .. n)
  repeat
    sleep(1)
    m = n; n = getNumberOf("all_trades")
    if run == nil then return end
  until n < m
  local t = os.clock()
  message("Num all trades: " .. m)
  repeat
    sleep(1)
    n = getNumberOf("all_trades")
    if run == nil then return end
  until n >= m         -- ожидание пока прокачаются все сделки
  t = os.clock() - t
  message(string.format("%.1f s; num: %u; avg: %.3f ms", t, n, t / n * 1000))
end
Код
local run = true
function OnStop()
  run = nil
end

function main()
  local n = getNumberOf("all_trades")
  local m = n
  message("Num all trades: " .. n)
  repeat
    sleep(1)
    m = n; n = getNumberOf("all_trades")
    if run == nil then return end
  until n < m
  local t = os.clock()
  message("Num all trades: " .. m)
  repeat
    sleep(1)
    n = getNumberOf("all_trades")
    if run == nil then return end
  until n >= m         -- ожидание пока прокачаются все сделки
  t = os.clock() - t
  message(string.format("with OnAllTrade:  %.1f s; num: %u; avg: %.3f ms", t, n, t / n * 1000))
end

function OnAllTrade(alltrade) end
Перезаказываете обезличенные сделки и замерете время прокачки всех сделок в обоих случаях.
Важно: в поле «Выбрать классы инструментов» указать все инструменты без фильтров для более точных измерений!
У меня результаты такие:
Код
40.2 s; num: 5719275; avg: 0.007 ms
with OnAllTrade:  85.7 s; num: 5731311; avg: 0.015 ms
Скрытый текст

Видно, что в первом случае упор идёт на пропускную способность канала, т.е. гипотетически сделки могли загрузиться быстрее при более широком канале.
Во втором случае скрипт не успевает обрабатывать колбэки с той скоростью, с которой поступают сделки. А мы помним, что колбэки работают в том же потоке, что и GUI.
Если у вас разницы нет, что с колбэком, что без него, значит узким местом является не процессор, а например, пропускная способность сети (подключение по Wi-Fi) или сервера. И тогда таким образом оценить оверхэд не получится.

Цитата
Nikolay написал:
При этом на демо Quik Junior, где поток данных очевидно низкий, это малозаметно.
Поэтому у разработчиков всё отлично и "не воспроизводится".
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
Старатель написал:
Оценить оверхэд от колбэков можно на следующих скриптах:
Как использовать:
  1. Настройка получения данных выполняется через пункт меню Система / Настройки / Основные настройки..., раздел «Программа» / «Получение данных» / «Обезличенные сделки»
    В поле «Выбрать классы инструментов» выбрать все без фильтров! Это важно для корректных измерений.
    Если у вас уже выбраны все классы без фильтров этот шаг можно пропустить. Если нет, - то нажать кнопку «Перезаказать данные».
     
  2. Подождать пока прокачаются все сделки и запустить первый скрипт.
     
  3. Снова перезаказать обезличенные сделки и дождаться, когда скрипт выведет итоговый результат и остановится.
     
  4. Повторить 3-й пункт со вторым скриптом.
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
nikolz написал:
можете сделать вывод времени входа и выхода для колбеков и для  main  c помощью точного счетчик Windows?
Если без излишеств, просто через os.clock, то сами колбеки работаю микросекунды. main уже зависит о того, что делает, но там тоже не что-то существенное.

Я пока наблюдаю странное - подключаешь несколько библиотек на 1000 функций - и привет. Собственно это в тесте и сделано, чтобы проверить влияние этого.
Я, конечно, понимаю, что Lua - не тот язык в котором обычно пишутся модули на тысячи строк, но как-то я не встречал упоминаний о влиянии этого на производительность. Хотя если вспомнить World of Warcraft, то ему не мешает.

Пришлось разбираться, т.к. в последних версиях терминала стало всё очень медленно если запущены "большие" скрипты, банально вкладки переключаются со скрипом.
Пальцем в небо - что-то сделали с GC. У меня функции использую локальные переменные, а функций много. В итоге GC надо работать. Как он работает в Квике не знаю, но надеюсь, что независимо от основного потока.

Впрочем, приведённый нагрузочный тест не делает ничего такого, чтобы сильно потреблять память, а падение производительности есть.
 
Цитата
Nikolay написал:
Я пока наблюдаю странное - подключаешь несколько библиотек на 1000 функций - и привет.
    Странно. Я ваш тест проверял в QUIK 13.0.1.2 брокер ВТБ. Никаких особенностей не заметил (с подключением пакетов и без). В вашем тесте мной был выполнен замер Время выполнения всех коллбеков / Общее время выполнения скрипта: ~0,0004.
  Вы выполняли ваш тест на другом ПК?
 
Цитата
TGB написал:
Никаких особенностей не заметил (с подключением пакетов и без).
Сколько у вас колбэков в секунду?
Надо делать так, как надо. А как не надо - делать не надо.
Страницы: 1
Читают тему
Наверх