Некоторые считают, что наличие пустых колбэков в скрипте не оказывает какой-либо значительной нагрузки на CPU.
Имеется ввиду, когда скрипт работает с одним или нескольким инструментом, а в колбэке стоит фильтр, отсеивающий все остальные инструменты, вида:
Скрытый текст |
|---|
| Код |
|---|
function OnParam(class_code, sec_code)
if class_code ~= class or sec_code ~= sec then return end
-- ...
end
function OnQuote(class_code, sec_code)
if class_code ~= class or sec_code ~= sec then return end
-- ...
end
function OnAllTrade(alltrade)
if alltrade.class_code ~= class or alltrade.sec_code ~= sec then return end
-- ...
end |
|
Давайте проверим. Для оценки оверхэда я буду использовать таблицу обезличенных сделок.
Сначала измеряем время загрузки таблицы с запущенным скриптом без колбэков (скрипт №1):
Скрытый текст |
|---|
| Код |
|---|
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 |
|
Затем измеряем время загрузки таблицы с запущенным скриптом, с пустым колбэком OnAllTrade (скрипт №2):
Скрытый текст |
|---|
| Код |
|---|
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 |
|
Как использовать:
- Настройка получения данных выполняется через пункт меню Система / Настройки / Основные настройки..., раздел «Программа» / «Получение данных» / «Обезличенные сделки»
В поле «Выбрать классы инструментов» выбрать все без фильтров! Это важно для корректных измерений, ниже объясню почему.
Если у вас уже выбраны все классы без фильтров этот шаг можно пропустить. Если нет, - то нажать кнопку «Перезаказать данные».
- Подождать пока прокачаются все сделки и запустить первый скрипт.
- Снова перезаказать обезличенные сделки и дождаться, когда скрипт выведет итоговый результат и остановится.
- Повторить 3-й пункт со вторым скриптом.
У меня получились такие результаты в QUIK 13.0.2.20:
Скрипт №1:
| Код |
|---|
38.9 s; num: 5497547; avg: 0.007 ms |
Скрипт №2:
| Код |
|---|
with OnAllTrade: 79.8 s; num: 5513332; avg: 0.014 ms |
В диспетчере задач это выглядит так:
Скрытый текст |
|---|
 |
Видно, что в первом случае упор идёт на пропускную способность канала (100 Мбит/с), т.е. гипотетически сделки могли загрузиться быстрее при более широком канале. Если у вас канал шире 100 Мбит/с, напишите, какие у вас результаты.
Во втором случае - занята только половина ширины канала. Очевидно упёрлись в CPU, и скрипт не успевает обрабатывать колбэки с той скоростью, с которой поступают сделки.
Среднее время обработки одной сделки в первом случае составляет 7 мкс, а во втором - 14 мкс.
Если у вас разницы нет, что с колбэком, что без него, значит узким местом является не процессор, а например, пропускная способность сети (подключение по Wi-Fi) или сервера.
Так, если выбрать заказ не всех обезличенных сделок, а только некоторых классов или отдельных инструментов, то время прокачки сделок с первым скриптом без колбэка практически не изменится, зато со вторым скриптом уменьшится. Это говорит о том, что данные поступают медленнее, чем их обрабатывает терминал, что не годится для оценки оверхэда.
Результаты при одновременном запуске 5 и 10 копий скрипта №1:
| Код |
|---|
39.3 s; num: 5566964; avg: 0.007 ms
39.3 s; num: 5566984; avg: 0.007 ms
39.3 s; num: 5566984; avg: 0.007 ms
39.3 s; num: 5566984; avg: 0.007 ms
39.3 s; num: 5566984; avg: 0.007 ms |
| Код |
|---|
39.1 s; num: 5583868; avg: 0.007 ms
39.1 s; num: 5583867; avg: 0.007 ms
39.1 s; num: 5583868; avg: 0.007 ms
39.1 s; num: 5583868; avg: 0.007 ms
39.1 s; num: 5583868; avg: 0.007 ms
39.1 s; num: 5583868; avg: 0.007 ms
39.1 s; num: 5583868; avg: 0.007 ms
39.1 s; num: 5583868; avg: 0.007 ms
39.1 s; num: 5583868; avg: 0.007 ms
39.1 s; num: 5583868; avg: 0.007 ms |
Скрытый текст |
|---|
 |
Среднее время на сделку не изменилось. Ограничением по-прежнему выступает пропускная способность канала.
Результаты при одновременном запуске 2 и 3 копий скрипта №2 (с колбэком):
| Код |
|---|
with OnAllTrade: 132.1 s; num: 5628639; avg: 0.023 ms
with OnAllTrade: 132.1 s; num: 5628645; avg: 0.023 ms |
Скрытый текст |
|---|
 |
| Код |
|---|
with OnAllTrade: 180.1 s; num: 5680264; avg: 0.032 ms
with OnAllTrade: 180.1 s; num: 5680264; avg: 0.032 ms
with OnAllTrade: 180.1 s; num: 5680264; avg: 0.032 ms |
Скрытый текст |
|---|
 |
Среднее время на сделку увеличивается примерно на ~9 мкс с добавлением каждого нового скрипта.
Данный тест показывает, что само по себе наличие даже пустого колбэка в скрипте оказывает влияние.
А поскольку колбэки работают в основном потоке квика, то это сказывается также и на работе графического интерфейса и квика в целом.