| //+------------------------------------------------------------------+
|
| //| 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
|
| 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>();
|
| tin += root["array_of_objects"][k]["tags"].size();
|
| }
|
|
|
| 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.08.28 11:41:17.417 ToyJson3 (EURUSD,H1) [acceso-wide] Time: 333
|
| 2026.08.28 11:41:17.528 ToyJson3 (EURUSD,H1) [acceso-deep] Time: 179
|
| 2026.08.28 11:41:17.638 ToyJson3 (EURUSD,H1) [acceso-array-large] Time: 394
|
| 2026.08.28 11:41:17.749 ToyJson3 (EURUSD,H1) [acceso-mixed-trading] Time: 766
|
| 2026.08.28 11:41:17.749 ToyJson3 (EURUSD,H1) sump=537.48 profit=-337.50 tin=4925578
|
| 2026.08.28 11:41:21.678 ToyJson3 (EURUSD,H1) [acceso-wide] Time: 328
|
| 2026.08.28 11:41:21.791 ToyJson3 (EURUSD,H1) [acceso-deep] Time: 382
|
| 2026.08.28 11:41:21.903 ToyJson3 (EURUSD,H1) [acceso-array-large] Time: 382
|
| 2026.08.28 11:41:22.015 ToyJson3 (EURUSD,H1) [acceso-mixed-trading] Time: 781
|
| 2026.08.28 11:41:22.015 ToyJson3 (EURUSD,H1) sump=537.48 profit=-337.50 tin=4925578
|
| 2026.08.28 11:41:26.861 ToyJson3 (EURUSD,H1) [acceso-wide] Time: 329
|
| 2026.08.28 11:41:26.969 ToyJson3 (EURUSD,H1) [acceso-deep] Time: 116
|
| 2026.08.28 11:41:27.080 ToyJson3 (EURUSD,H1) [acceso-array-large] Time: 380
|
| 2026.08.28 11:41:27.190 ToyJson3 (EURUSD,H1) [acceso-mixed-trading] Time: 776
|
| 2026.08.28 11:41:27.190 ToyJson3 (EURUSD,H1) sump=537.48 profit=-337.50 tin=4925578
|
| 2026.08.28 11:41:30.869 ToyJson3 (EURUSD,H1) [acceso-wide] Time: 330
|
| 2026.08.28 11:41:30.978 ToyJson3 (EURUSD,H1) [acceso-deep] Time: 192
|
| 2026.08.28 11:41:31.090 ToyJson3 (EURUSD,H1) [acceso-array-large] Time: 382
|
| 2026.08.28 11:41:31.200 ToyJson3 (EURUSD,H1) [acceso-mixed-trading] Time: 822
|
| 2026.08.28 11:41:31.200 ToyJson3 (EURUSD,H1) sump=537.48 profit=-337.50 tin=4925578
|
|
|
| */
|