Библиотеки: JSON Serialization and Deserialization (native MQL) - страница 8

 
o_o:

Библиотека работает в MQL4 и MQL5

Благодарность принимается в виде примеров вашей практической работы с веб-ресурсами из MQL.  ;)


Добрый день! 

Спасибо за библиотеку!

Применил вашу библиотеку для мониторинга работы компьютеров, подключенных к пулу для майнинга криптовалют.

Пул (это сайт) в ответ на запрос о состоянии выдает ответ в виде: 

/*

{"status":"OK",

"data":[

{"worker":"riga1","lastSeen":1511432055,"currentHashrate":2746.6666666666665,"validShares":103,"invalidShares":0,"staleShares":null},

{"worker":"riga2","lastSeen":1511432068,"currentHashrate":3040,"validShares":114,"invalidShares":1,"staleShares":null},

{"worker":"riga3","lastSeen":1511432057,"currentHashrate":2426.6666666666665,"validShares":91,"invalidShares":0,"staleShares":null},

{"worker":"riga4","lastSeen":1511432055,"currentHashrate":2266.6666666666665,"validShares":85,"invalidShares":0,"staleShares":null},

{"worker":"riga5","lastSeen":1511432061,"currentHashrate":2666.6666666666665,"validShares":100,"invalidShares":0,"staleShares":null},

{"worker":"riga6","lastSeen":1511432050,"currentHashrate":2293.3333333333335,"validShares":86,"invalidShares":0,"staleShares":null},

{"worker":"riga7","lastSeen":1511432069,"currentHashrate":1013.3333333333334,"validShares":38,"invalidShares":0,"staleShares":null}]}

*/

riga1, riga2  и т.д. - это компьютеры, необходимо промониторить, чтобы их "currentHashrate" не падал ниже порогового значения.

код получился очень простой : 

void Fly_API_Monitor()
{

int res=0; string url;  string cook=""; string ref=""; string res_header=""; 
char result[]; 
char data[];
string strRes="";
// Тут вписывается свой кошелек
string wallet="t1L8S ............";
ResetLastError();
url="https://api-zcash.flypool.org/miner/" + wallet + "/workers/monitor"; 
res=WebRequest("GET", url, cook, ref, 5000, data,0, result, res_header);
strRes=CharArrayToString(result,CP_ACP);
if (res !=-1)
{
//Print("Ошибки нет");
//Print(strRes);
CJAVal dataM;
dataM.Deserialize(strRes);
string stat=dataM["status"].ToStr();
int i=0;
for(i=0; i< ArraySize(dataM["data"].m_e); i++) 
{ 
Print(dataM["data"].m_e[i]["worker"].ToStr()+" Хешрейт: "+ dataM["data"].m_e[i]["currentHashrate"].ToStr());
}
}
else 
{
Print("Ошибка "+IntegerToString(GetLastError()));
Print(strRes);
}
}

выдает типа: 

riga7 Хешрейт: 826.6666

riga6 Хешрейт: 2293.333

riga5 Хешрейт: 3200

riga4 Хешрейт: 1866.666

riga3 Хешрейт: 2800

riga2 Хешрейт: 2853.333

riga1 Хешрейт: 2933.333


 

Разработчикам библиотеки огромное спасибо, но она работала очень медленно, обычно перед тем как выкладывать какой либо продукт или код, его необходимо профилировать, но в данном варианте так как библиотека бесплатная, тут грех жаловаться, по итогу библиотека работает очень медленно, если не сделать вот этого:

было:

        virtual CJAVal* AddBase(const CJAVal &item) { int c=ArraySize(m_e); ArrayResize(m_e, c+1); m_e[c]=item; m_e[c].m_parent=GetPointer(this); return GetPointer(m_e[c]); } // добавление
        virtual CJAVal* NewBase() { int c=ArraySize(m_e); ArrayResize(m_e, c+1); return GetPointer(m_e[c]); } // добавление

стало:

        virtual CJAVal* AddBase(const CJAVal &item) { int c=ArraySize(m_e); ArrayResize(m_e, c+1, 50000); m_e[c]=item; m_e[c].m_parent=GetPointer(this); return GetPointer(m_e[c]); } // добавление
        virtual CJAVal* NewBase() { int c=ArraySize(m_e); ArrayResize(m_e, c+1, 50000); return GetPointer(m_e[c]); } // добавление

Иначе вот что было до (сам Web запрос на данном скрине занял по времени 16 718 439, все остальное обработка):

и после доработки (стрелкой показан тот же Web запрос):

Ускорение получили почти в 20 раз.

 
Daniil Kurmyshev:

почему 50000 ?

не 2000000 или не 100?

--

на каких тестовых данных проверяли?

 

на данных, которых в общей сложности получается от 10000 - 30000, по этому и выбрал 50000 с запасом), но ранее я использовал эту библиотеку на значениях около 280 в массиве, в этом варианте и 500 достаточно, 50000 это конечно для тех у кого ресурсы системы позволяют.

 

согласно документации параметр резервации просто уменьшает число перераспределения памяти

проверьте пожалуйста на вашей тестовой выборке с параметром 100 (1000, 10000)

какой при этом будет выигрышь скорости на скрине профилирования

 
o_o:

согласно документации параметр резервации просто уменьшает число перераспределения памяти

проверьте пожалуйста на вашей тестовой выборке с параметром 100 (1000, 10000)

какой при этом будет выигрышь скорости на скрине профилирования


Да это именно так, я для себя лично конечно подобрал оптимальный параметр перераспределения, теперь самая долгая функция из всех это десериализация..., но оно в принципе и ясно, хотя по идеи как я понимаю в этой библиотеке все сделано методами перебора и максимальной универсальности, но мне все таки кажется что где-то ещё в десериализации есть нюанс который можно оптимизировать... скриншот профилирования прикрепил, параметры перераспределения памяти 5000.


 

1.12

поставил шаг 100 в ArrayResize

Файлы:
JAson.mqh  31 kb
 
Обратите внимание, что профайлер работает по неоптимизированному коду.

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

Мы чуть позже постараемся для профайлера использовать полурелизную оптимизацию. Там есть достаточно много проблемных вопросов.
 
Привет, спасибо за эту родную MQL и быструю библиотеку, было бы полезнее, если бы была документация, особенно при работе с JSON массивами и объектами, как извлекать из них данные:
Предположим:
[[0.88678,true],[0.88668,false]]
Как я могу отобразить это в типы MQL после десериализации?

 

Уважаемые специалисты! Прошу Вас помочь мне разобраться с библиотекой. ( в объектно ориентированном программировании я пока не силен поэтому я не могу разобраться в коде самой библиотеки и в статье посвященной бирже BTC-E. поэтому я прошу простого примера как в посте )

Мне нужно разобрать два публичных апи биржи WEX.NZ.

https://wex.nz/api/3/info

{
  "server_time": 1519120845,
  "pairs": {
    "btc_usd": {
      "decimal_places": 3,
      "min_price": 0.1,
      "max_price": 500000,
      "min_amount": 0.001,
      "hidden": 0,
      "fee": 0.2
    },
    "btc_rur": {
...

отсюда, мне нужно в массив получить все доступные пары (btc_usd, btc_rur, ...) (просто названия пар, без параметров, параметры, по известным названиям у меня получается получать...)


https://wex.nz/api/3/depth/btc_usd

{
  "btc_usd": {
    "asks": [
      [
        11550,
        0.00998
      ],
      [
        11559.9,
        0.01731136
      ],
...
      ]
    ],
    "bids": [
      [
        11506.031,
        1.756
      ],
      [
        11506.03,
        1.23
      ],
...
      ]
    ]
  }
}


а отсюда в два массива (asks и bids) получить цену и стоимость ордеров.

Буду очень признателен за помощь!!! Заранее Спасибо!