程序库: JSON Serialization and Deserialization (native MQL) - 页 8

 
o_o:

该库可在 MQL4 和 MQL5 中运行

如果您能提供使用 MQL 网络资源的实际工作案例,我们将不胜感激。)


下午好!

感谢您提供的库!

我使用您的库来监控连接到加密货币矿池的计算机的工作。

矿池(它的网站)在响应状态查询时给出了以下形式的响应:

/*

{"status":"OK",

"data":[

{"worker":"rigma1","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("No error");
//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 Hashrate: 826.6666

riga6 Hashrate: 2293.333

riga5 Hashrate: 3200.

riga4 桥速: 1866.666

riga3 桥速: 2800

riga2 Hashrate: 2853.333.

riga1 Hashrate: 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]); } // 添加

否则,这就是之前的情况(该屏幕上的网络请求本身耗时 16,718,439,其余所有处理过程耗时均为 16,718,439):

和调整后的情况(箭头显示的是同一个网络请求):

速度提高了近 20 倍。

 
Daniil Kurmyshev:

为什么是 50,000?

而不是 2000 万或 10 万?

--

您使用的是哪种测试数据?

 

在数据上,总共需要 10000 - 30000 个数据,因此我选择了 50000 个预留数据),但早些时候我曾在数组中使用过大约 280 个值的这个库,在这个版本中,500 个就足够了,50000 个肯定是那些系统资源允许的人使用的。

 

根据文档,保留参数只是减少了内存重新分配的次数

请使用参数 100(1000,10000)检查您的测试样本

在这种情况下,剖析屏幕上的速度提升情况如何

 
o_o:

根据文档,保留参数只是减少了内存重新分配的次数

请使用参数 100(1000,10000)检查您的测试样本

剖析屏幕上的速度增益是多少?


是的,就是这样,我个人找到了重新分配的最佳参数,现在所有函数中最长的是反序列化......,但原则上是明确的,虽然按照我的理解,在这个库中,一切都是通过搜索和最大通用性的方法实现的,但我仍然认为在反序列化的其他地方有一个细微差别可以优化....。我附上了剖析截图,内存重新分配参数为 5000。


 

1.12

ArrayResize 中设置第 100 步

附加的文件:
JAson.mqh  31 kb
 
请注意,剖析器是 针对未优化的代码工作的。

因此,在经过很好的优化后,在发行版中重新编译时,瓶颈将进入完全不同的区域。

我们稍后将尝试在剖析器中使用半发布优化。这里有很多问题。
[删除]  
您好,感谢您提供这个本地 MQL 和快速库,如果能提供一份文档会更有帮助,特别是在处理 JSON 数组和对象时,如何从中提取数据:
假设:
[[0.88678,true],[0.88668,false]]
如何在反序列化 后将其映射为 MQL 类型?

 

亲爱的专家们请帮助我理解这个库。(我还不擅长面向对象编程,所以我无法理解库本身的代码和专门介绍 BTC-E 交易所的文章。这就是为什么我需要一个简单的例子,就像 中的例子一样)。

我需要解析 WEX.NZ 交易所的两个公共 api。

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),以获得订单的价格和价值。

如蒙帮助,我将不胜感激!..!在此先表示感谢!