JsonParserByLeo/Test/Ben/ToyJson3.mq5
172 lines
5.5 KiB
MQL5
Nique_372
2026-06-29 14:22:15 -05:00
//+------------------------------------------------------------------+
//| 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
Nique_372
2026-08-28 12:02:03 -05:00
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
Nique_372
2026-10-03 17:00:34 -05:00
//#define JSONBENCH_RUN_PARSE
Nique_372
2026-08-28 12:02:03 -05:00
Nique_372
2026-06-29 14:22:15 -05:00
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
#include "..\\Other\\toyjson3.mqh"
Nique_372
2026-08-28 12:02:03 -05:00
#include "Def.mqh"
#define LIBNAME "ToyJson3"
Nique_372
2026-06-29 14:22:15 -05:00
// 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()
{
//---
Nique_372
2026-08-28 12:02:03 -05:00
#ifdef JSONBENCH_RUN_PARSE
Nique_372
2026-06-29 14:22:15 -05:00
JsParser parser;
parser.copy = g_json_data;
ulong a = GetMicrosecondCount();
Nique_372
2026-08-28 12:02:03 -05:00
for(int i = 0; i < 1000; i++)
Nique_372
2026-06-29 14:22:15 -05:00
{
parser.tokenize();
}
Nique_372
2026-08-28 12:02:03 -05:00
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
Nique_372
2026-09-17 21:24:16 -05:00
TSN::CRandom<Xoshiro256> xo;
Nique_372
2026-08-28 12:02:03 -05:00
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>();
Nique_372
2026-10-03 17:00:34 -05:00
const int s = root["array_of_objects"][k]["tags"].size();
tin += StringLen(root["array_of_objects"][k]["tags"][k %s].get<string>());
Nique_372
2026-08-28 12:02:03 -05:00
}
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
Nique_372
2026-06-29 14:22:15 -05:00
}
//+------------------------------------------------------------------+
Nique_372
2026-08-28 12:02:03 -05:00
/*
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
Nique_372
2026-10-03 17:00:34 -05:00
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
Nique_372
2026-08-28 12:02:03 -05:00
*/