| //+------------------------------------------------------------------+
|
| //| ToyJson3.mq5 |
|
| //| Copyright 2026, Niquel Mendoza. |
|
| //| https://www.mql5.com/ |
|
| //+------------------------------------------------------------------+
|
| #property copyright "Copyright 2026, Niquel Mendoza."
|
| #property link "https://www.mql5.com/"
|
| #property version "1.00"
|
| #property strict
|
|
|
| //+------------------------------------------------------------------+
|
| //| |
|
| //+------------------------------------------------------------------+
|
| //#define JSONBENCH_RUN_PARSE
|
|
|
| //+------------------------------------------------------------------+
|
| //| |
|
| //+------------------------------------------------------------------+
|
| #include "..\\Other\\toyjson3.mqh"
|
| #include "Def.mqh"
|
|
|
| #define LIBNAME "ToyJson3"
|
|
|
| // Intente probarlo pero creo que es complejo dado que como usa punteros hacer 1000 iteraciones
|
| // Conllavea un monton de news y ademas necesitora elimianr todoss los objetos que crea en cada
|
| // iteracion lo cual no creo qeu sea justo
|
| // asi qeu probare noma "tokenize" qeu es una funcion previa a parse value..
|
| // por lo visto demora mucho.. asi qeu con eso creo qeu ya con seguridad
|
| // no creo que valha el esfuerzo estar reformando el parser para que no retorne punteros o aalgo asi..
|
|
|
| //+------------------------------------------------------------------+
|
| //| Script program start function |
|
| //+------------------------------------------------------------------+
|
| void OnStart()
|
| {
|
| //---
|
|
|
| #ifdef JSONBENCH_RUN_PARSE
|
| JsParser parser;
|
| parser.copy = g_json_data;
|
|
|
| ulong a = GetMicrosecondCount();
|
| for(int i = 0; i < 1000; i++)
|
| {
|
| parser.tokenize();
|
| }
|
| ulong b = GetMicrosecondCount();
|
| Print("@", b - a);
|
|
|
|
|
|
|
| #else // JSONBENCH_RUN_PARSE
|
|
|
| //--- Parseo unico (como con JAson, punteros no son problema para medir acceso)
|
| JsParser parser;
|
| parser.copy = g_json_test_access;
|
| JsValue *root = parser.parse(g_json_test_access);
|
|
|
| if(parser.error || root == NULL)
|
| {
|
| if(root != NULL)
|
| delete root;
|
| Print("Error parseando test.json con ToyJson3");
|
| return;
|
| }
|
|
|
| JsValue *wide = root["wide_object"];
|
| string keys[];
|
| wide.getProperties(keys);
|
| const int n = ArraySize(keys);
|
|
|
| //-- Random
|
| TSN::CRandom<Xoshiro256> xo;
|
| xo.Seed(JSONBENCH_ACCESO_XHOR_SEED);
|
|
|
| // init
|
| double sump = 0.0, profit = 0.0;
|
| long tin = 0;
|
|
|
| //--
|
| ulong a = GetMicrosecondCount();
|
| for(int i = 0; i < JSONBENCH_TOTAL_ITER_ACCESO; i++)
|
| {
|
| const string key = keys[xo.RandomInteger(0, n)];
|
| root["wide_object"][key];
|
| }
|
| ulong b = GetMicrosecondCount();
|
|
|
| Sleep(100);
|
|
|
| JSONBENCH_ACCES_CALL(JSONBENCH_TAGOP_ACCESO_WIDE)
|
|
|
|
|
|
|
| a = GetMicrosecondCount();
|
| for(int i = 0; i < JSONBENCH_TOTAL_ITER_ACCESO; i++)
|
| {
|
| string dummy = root["deep_object"]["l1"]["l2"]["l3"]["l4"]["l5"]["l6"]["l7"]["l8"]["l9"]["l10"]["target"].s;
|
| }
|
| b = GetMicrosecondCount();
|
|
|
| Sleep(100);
|
|
|
| JSONBENCH_ACCES_CALL(JSONBENCH_TAGOP_ACCESO_DEEP)
|
|
|
|
|
| a = GetMicrosecondCount();
|
| for(int i = 0; i < JSONBENCH_TOTAL_ITER_ACCESO; i++)
|
| {
|
| const int index = xo.RandomInteger(0, 10000);
|
| tin += (long)root["large_array"][index].get<long>();
|
| }
|
| b = GetMicrosecondCount();
|
|
|
| Sleep(100);
|
|
|
| JSONBENCH_ACCES_CALL(JSONBENCH_TAGOP_ACCESO_LARGE_ARR)
|
|
|
|
|
| a = GetMicrosecondCount();
|
|
|
| for(int k = 0; k < 500; k++)
|
| {
|
| sump += root["array_of_objects"][k]["price"].get<double>();
|
| profit += root["array_of_objects"][k]["profit"].get<double>();
|
| const int s = root["array_of_objects"][k]["tags"].size();
|
| tin += StringLen(root["array_of_objects"][k]["tags"][k %s].get<string>());
|
| }
|
|
|
| b = GetMicrosecondCount();
|
|
|
| Sleep(100);
|
|
|
| JSONBENCH_ACCES_CALL(JSONBENCH_TAGOP_ACCESO_MIX)
|
|
|
|
|
| //----
|
| PrintFormat("sump=%.2f profit=%.2f tin=%d ", sump, profit, tin);
|
|
|
| //--- liberar el arbol creado por parse() (usa new internamente)
|
| delete root;
|
|
|
| //---
|
| JSONBENCH_FINISH
|
|
|
| #endif // JSONBENCH_RUN_PARSE
|
| }
|
| //+------------------------------------------------------------------+
|
| /*
|
| 2026.08.28 12:01:02.893 ToyJson3 (EURUSD,H1) @4486362
|
| 2026.08.28 12:01:10.131 ToyJson3 (EURUSD,H1) @4418494
|
| 2026.08.28 12:01:16.573 ToyJson3 (EURUSD,H1) @4422841
|
| 2026.08.28 12:01:25.067 ToyJson3 (EURUSD,H1) @4470388
|
|
|
|
|
| 2026.10.03 15:23:43.758 ToyJson3 (EURUSD,H1) [acceso-wide] Time: 333
|
| 2026.10.03 15:23:43.869 ToyJson3 (EURUSD,H1) [acceso-deep] Time: 117
|
| 2026.10.03 15:23:43.981 ToyJson3 (EURUSD,H1) [acceso-array-large] Time: 388
|
| 2026.10.03 15:23:44.091 ToyJson3 (EURUSD,H1) [acceso-mixed-trading] Time: 1011
|
| 2026.10.03 15:23:44.091 ToyJson3 (EURUSD,H1) sump=537.48 profit=-337.50 tin=4927909
|
| 2026.10.03 15:23:45.348 ToyJson3 (EURUSD,H1) [acceso-wide] Time: 335
|
| 2026.10.03 15:23:45.459 ToyJson3 (EURUSD,H1) [acceso-deep] Time: 224
|
| 2026.10.03 15:23:45.570 ToyJson3 (EURUSD,H1) [acceso-array-large] Time: 393
|
| 2026.10.03 15:23:45.683 ToyJson3 (EURUSD,H1) [acceso-mixed-trading] Time: 928
|
| 2026.10.03 15:23:45.683 ToyJson3 (EURUSD,H1) sump=537.48 profit=-337.50 tin=4927909
|
| 2026.10.03 15:23:46.878 ToyJson3 (EURUSD,H1) [acceso-wide] Time: 333
|
| 2026.10.03 15:23:46.989 ToyJson3 (EURUSD,H1) [acceso-deep] Time: 302
|
| 2026.10.03 15:23:47.102 ToyJson3 (EURUSD,H1) [acceso-array-large] Time: 373
|
| 2026.10.03 15:23:47.213 ToyJson3 (EURUSD,H1) [acceso-mixed-trading] Time: 982
|
| 2026.10.03 15:23:47.213 ToyJson3 (EURUSD,H1) sump=537.48 profit=-337.50 tin=4927909
|
|
|
| */
|