Встречайте учебник «Программирование на MQL5 для трейдеров» - страница 11

 
Stanislav Korotky #:

В книге упрощенный пример, на производительность не оптимизировался. Я его постоянно допиливаю в разных направлениях для текущих проектов, но целенаправленно по производительности не менял, за исключением того что в stringify убрал большие тормоза (проявлялись на очень больших объектах под десятки Мб). Могу скинуть текущую рабочую версию в личку.

Сам я не в теме json, только знакомлюсь. Увидел этот бенчмарк. Заинтересовал вопрос производительности перед тем, как погружаться.

Будет полезно, если выложите свое решение в КБ. Спасибо.

почти первоапрельское
почти первоапрельское
  • 2024.04.01
  • www.mql5.com
Короткая история иллюстрированная кодом, о том как компилируемый MQL слил интерпретатору Tcl в 8 раз
 
fxsaber #:

Сам я не в теме json, только знакомлюсь. Увидел этот бенчмарк. Заинтересовал вопрос производительности перед тем, как погружаться.

Будет полезно, если выложите свое решение в КБ. Спасибо.

Текущая версия toyjson дает примерно такое же быстродействие, что и приведенное в блоге решение на MQL, НО! Большое НО! Сравнение в блоге абсолютно некорректное, потому что там для проверки tcl -- сообщение сперва парсится и транслируется в объект tcl, плюс сам код tcl транслируется в инструкции ("машинный код tcl") и только потом выполняется засечка времени для выполнения оттранслированной tcl-функции на оттранслированном json-объекте. Если бы все эти трансляции запихули в 1000 циклов повтора, как для MQL, быстродействие было б гораздо хуже.

В качестве аналогии, мы тоже можем написать процедуру предварительного парсинга и трансляции json-текста в нативные структуры MQL, а потом засекать время только на зацикленный просмотр внутри этих структур - получим супер-быстродействие. Но нужно потратиться на предварительное написание такого преобразователя.

PS. Ради прикола сейчас вынес начальный парсинг из цикла и получил ускорение в 33 раза, что быстрее tcl в 4 раза ;-).

 
Stanislav Korotky #:

Текущая версия toyjson дает примерно такое же быстродействие, что и приведенное в блоге решение на MQL, НО! Большое НО! Сравнение в блоге абсолютно некорректное, потому что там для проверки tcl -- сообщение сперва парсится и транслируется в объект tcl, плюс сам код tcl транслируется в инструкции ("машинный код tcl") и только потом выполняется засечка времени для выполнения оттранслированной tcl-функции на оттранслированном json-объекте. Если бы все эти трансляции запихули в 1000 циклов повтора, как для MQL, быстродействие было б гораздо хуже.

В качестве аналогии, мы тоже можем написать процедуру предварительного парсинга и трансляции json-текста в нативные структуры MQL, а потом засекать время только на зацикленный просмотр внутри этих структур - получим супер-быстродействие. Но нужно потратиться на предварительное написание такого преобразователя.

PS. Ради прикола сейчас вынес начальный парсинг из цикла и получил ускорение в 33 раза.

как автор того самого "бенчамрка"..

вы не правы. При первом вызове код процедуры tcl собирается в байт код. Но только код, а не передаваемые ему данные. Точно так-же с MQL - время компиляции мы же не включаем в тесты ?

 
Stanislav Korotky #:


PS. Ради прикола сейчас вынес начальный парсинг из цикла и получил ускорение в 33 раза, что быстрее tcl в 4 раза ;-).

Tcl_Obj objMessage=tcl.Ref(tcl.Obj(message));

это только конвертация текста в utf-8

если её поставить в цикл, дополнительно посчитаете время StringToCharArray 


 
Maxim Kuznetsov #:

это только конвертация текста в utf-8

если её поставить в цикл, дополнительно посчитаете время StringToCharArray 

Я не знаком с Tcl, потому использую открытые источники:

For a JSON object the Tcl_Obj is a dictionary, for an array it is a list, and so on. This allows efficient use of the contained values by Tcl

Это не строка уже!

При этом сам парсинг в этот словарь делает не Tcl, а библиотека RL_JSON, написанная на C++.

RL_JSON. This package adds a command [json] to the interpreter, and defines a new Tcl_Obj type to store the parsed JSON document.

Не надо мошенничать.

 
Stanislav Korotky #:

Я не знаком с Tcl, потому использую открытые источники:

Это не строка уже!

При этом сам парсинг в этот словарь делает не Tcl, а библиотека RL_JSON, написанная на C++.

Не надо мошенничать.

На входе в функцию там та-же самая строка. 

tcl.Obj(string) это :

Tcl_Obj 
ATcl_FromString(string s) export
{
   uchar bytes[];
   int len;
   len=StringToCharArray(s,bytes,0,WHOLE_ARRAY,CP_UTF8);
   return ATcl_FromUTF8(bytes,len-1);
//   return ATcl_FromUnicode(s,StringLen(s));
}

то есть в основном StringToCharArray() MQL и далее Tcl_NewStringObj(bytes, length)..если впихнёте его внутрь цикла - померяете StringToCharArray() заодно ;-)

Для пущей гарантии можно дополнительно сделать obj.Ref(). (в tcl сущность с более чем 1-й ссылкой становится константой, не будет mutable, внутреннее представление защищено)

  Tcl_Obj objMessage=tcl.Ref(tcl.Ref(tcl.Obj(message)));

с тем-же прекрасным результатом:

-------

а то что язык расширяется библиотеками и парсинг (и многие прочие частности) делается в значительной части ими вас как-то смущает ? 

-------

если вам так спокойнее и удобнее - считайте что MQL просто превысил скорость света, и на скриншоте квантовые эффекты

 
Maxim Kuznetsov #:

На входе в функцию там та-же самая строка. 

tcl.Obj(string) это :

то есть в основном StringToCharArray() MQL и далее Tcl_NewStringObj(bytes, length)..если впихнёте его внутрь цикла - померяете StringToCharArray() заодно ;-)

Для пущей гарантии можно дополнительно сделать obj.Ref(). (в tcl сущность с более чем 1-й ссылкой становится константой, не будет mutable, внутреннее представление защищено)

  Tcl_Obj objMessage=tcl.Ref(tcl.Ref(tcl.Obj(message)));

с тем-же прекрасным результатом:

-------

а то что язык расширяется библиотеками и парсинг (и многие прочие частности) делается в значительной части ими вас как-то смущает ? 

-------

если вам так спокойнее и удобнее - считайте что MQL просто превысил скорость света, и на скриншоте квантовые эффекты

Вы либо плохо сами знаете Tcl, либо нагло манипулируете. Объект [json], встроенный в Tcl через упомянутую мною выше библиотеку, кеширует json-строки (ключи) в словаре во время первого парсинга и оставляет их в словаре для всех последующих использований (даже другими объектами) вплоть до завершения текущей сессии Tcl. Получается, что при вашем тесте с циклом в 1000, Tcl на самом деле парсит json однократно, а потом просто просматривает словарь.

Я привел тайминг для адекватного теста, когда парсинг в MQL тоже делается однократно и существенно обгоняет Tcl. Делайте разбор сообщения в Tcl не через [json], а напрямую - это и будет "быстродействие" Tcl. А подключить оптимизированную DLL для работы c json мы можем и в MQL.

Попросил бы не флудить более в данном топике.

 
Stanislav Korotky #:

Вы либо плохо сами знаете Tcl, либо нагло манипулируете. Объект [json], встроенный в Tcl через упомянутую мною выше библиотеку, кеширует json-строки (ключи) в словаре во время первого парсинга и оставляет их в словаре для всех последующих использований (даже другими объектами) вплоть до завершения текущей сессии Tcl. Получается, что при вашем тесте с циклом в 1000, Tcl на самом деле парсит json однократно, а потом просто просматривает словарь.

Я привел тайминг для адекватного теста, когда парсинг в MQL тоже делается однократно и существенно обгоняет Tcl. Делайте разбор сообщения в Tcl не через [json], а напрямую - это и будет "быстродействие" Tcl. А подключить оптимизированную DLL для работы c json мы можем и в MQL.

Попросил бы не флудить более в данном топике.

считайте как вам угодно, как вам нравится..хоть что солнце встаёт и заходит на севере..выше про это написал. 

а собственно флуд вы и поднимаете. Ещё и хамите

 
Vitaliy Kuznetsov #:

Как только ИИ дойдёт до уровня человека, то не только программисты, а ещё целый вагон профессий перейдут в разряд "промт-инженер-консультант для ИИ". Но знания всё равно нужны будут, чтобы понимать куда направлять.

Тут подумал, что если в самом учебнике MQL4 давать сноски на то, как это будет в МQL5, то получится 3-я книга. Причём, самая толстая.

А зачем нужна книга по четверке? Я ее использую исключительно потому, что за статьи на инвестсоциал платят бонусы на четверочный счет. Не пропадать же добру. А так только пятерка.