//+------------------------------------------------------------------+ //| Ben.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 "..\\..\\Src\\Json.mqh" #include "Def.mqh" #define LIBNAME "JsonParserByLeo" //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- TSN::CJsonParser parser; //--- Parseo #ifdef JSONBENCH_RUN_PARSE parser.Assing(g_json_data); parser.CorrectPadding(); Sleep(500); ulong a = GetMicrosecondCount(); for(int i = 0; i < JSONBENCH_TOTAL_ITER_PARSE; i++) { parser.Parse(); } ulong b = GetMicrosecondCount(); Sleep(250); Print("@", (b - a)); //--- #else //--- previa parser.Assing(g_json_test_access); parser.CorrectPadding(); parser.Parse(); TSN::CJsonNode root = parser.GetRoot(); string keys[]; const int n = root["wide_object"].GetKeys(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++) { root["deep_object"]["l1"]["l2"]["l3"]["l4"]["l5"]["l6"]["l7"]["l8"]["l9"]["l10"]["target"].ToString(); } 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 += root["large_array"].AtHomegeneo(index).ToInt(0); } 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"].At(k)["price"].ToDouble(0.0); profit += root["array_of_objects"].At(k)["profit"].ToDouble(0.0); tin += root["array_of_objects"].At(k)["tags"].Size(); } b = GetMicrosecondCount(); Sleep(100); JSONBENCH_ACCES_CALL(JSONBENCH_TAGOP_ACCESO_MIX) //---- PrintFormat("sump=%.2f profit=%.2f tin=%d ", sump, profit, tin); //--- JSONBENCH_FINISH //--- #endif } //+------------------------------------------------------------------+ /* 2026.08.28 08:32:02.709 UtilHeader (EURUSD,H1) [MultiBen& - $[parse|twitter.json|JsonParserByLeo|1000] 2026.08.28 08:32:12.732 JSPBLBench (EURUSD,H1) @672222 2026.08.28 08:32:16.829 JSPBLBench (EURUSD,H1) @648422 2026.08.28 08:32:21.412 JSPBLBench (EURUSD,H1) @647487 2026.08.28 08:32:25.529 JSPBLBench (EURUSD,H1) @648913 2026.08.28 08:32:30.135 JSPBLBench (EURUSD,H1) @649396 2026.08.28 10:34:41.919 JSPBLBench (EURUSD,H1) [acceso-wide] Time: 136 2026.08.28 10:34:42.029 JSPBLBench (EURUSD,H1) [acceso-deep] Time: 657 2026.08.28 10:34:42.141 JSPBLBench (EURUSD,H1) [acceso-array-large] Time: 116 2026.08.28 10:34:42.253 JSPBLBench (EURUSD,H1) [acceso-mixed-trading] Time: 1787 2026.08.28 10:34:42.253 JSPBLBench (EURUSD,H1) sump=537.48 profit=-337.50 tin=4925578 2026.08.28 10:34:28.421 JSPBLBench (EURUSD,H1) [acceso-wide] Time: 137 2026.08.28 10:34:28.533 JSPBLBench (EURUSD,H1) [acceso-deep] Time: 679 2026.08.28 10:34:28.643 JSPBLBench (EURUSD,H1) [acceso-array-large] Time: 117 2026.08.28 10:34:28.755 JSPBLBench (EURUSD,H1) [acceso-mixed-trading] Time: 1823 2026.08.28 10:34:28.755 JSPBLBench (EURUSD,H1) sump=537.48 profit=-337.50 tin=4925578 2026.08.28 10:35:26.422 JSPBLBench (EURUSD,H1) [acceso-wide] Time: 136 2026.08.28 10:35:26.532 JSPBLBench (EURUSD,H1) [acceso-deep] Time: 697 2026.08.28 10:35:26.645 JSPBLBench (EURUSD,H1) [acceso-array-large] Time: 113 2026.08.28 10:35:26.757 JSPBLBench (EURUSD,H1) [acceso-mixed-trading] Time: 2403 2026.08.28 10:35:26.757 JSPBLBench (EURUSD,H1) sump=537.48 profit=-337.50 tin=4925578 2026.08.28 10:35:34.858 JSPBLBench (EURUSD,H1) [acceso-wide] Time: 137 2026.08.28 10:35:34.970 JSPBLBench (EURUSD,H1) [acceso-deep] Time: 661 2026.08.28 10:35:35.079 JSPBLBench (EURUSD,H1) [acceso-array-large] Time: 116 2026.08.28 10:35:35.193 JSPBLBench (EURUSD,H1) [acceso-mixed-trading] Time: 2485 2026.08.28 10:35:35.193 JSPBLBench (EURUSD,H1) sump=537.48 profit=-337.50 tin=4925578 */ /* //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ #define RYML_SINGLE_HDR_DEFINE_NOW #include "yaml.hpp" #include #include #include #include #include #include #include #include // ── Error handler ───────────────────────────────────────────────────────────── struct YamlErrorHandler { ryml::Callbacks original = ryml::get_callbacks(); ryml::Callbacks callbacks() { ryml::Callbacks cb; cb.set_error_parse([](ryml::csubstr msg, ryml::ErrorDataParse const& e, void*) { throw std::runtime_error( std::string(msg.str, msg.len) + " [linea " + std::to_string(e.ymlloc.line) + ", col " + std::to_string(e.ymlloc.col) + "]" ); }); cb.set_error_basic([](ryml::csubstr msg, ryml::ErrorDataBasic const&, void*) { throw std::runtime_error(std::string(msg.str, msg.len)); }); return cb; } void install() { ryml::set_callbacks(callbacks()); } void uninstall() { ryml::set_callbacks(original); } }; // ── Leer archivo ────────────────────────────────────────────────────────────── std::string read_file(const char* path) { std::ifstream f(path); if (!f.is_open()) { std::cerr << "No se pudo abrir: " << path << "\n"; exit(1); } std::ostringstream ss; ss << f.rdbuf(); return ss.str(); } int main() { const char* YAML_PATH = R"(C:\Users\USER\Documents\te\twitter.json)"; constexpr int WARMUP = 20; constexpr int ITERS = 1000; std::string content = read_file(YAML_PATH); std::cout << "Archivo : " << YAML_PATH << "\n"; std::cout << "Tamanio : " << content.size() << " bytes (" << content.size() / 1024.0 << " KB)\n"; std::cout << "Iteraciones : " << ITERS << "\n\n"; // ── Buffer mutable ──────────────────────────────────────────────────────── // parse_in_place MUTA el buffer en cada llamada. // Por eso se restaura desde 'content' antes de cada parse. std::vector buf(content.begin(), content.end()); buf.push_back('\0'); // ── Instalar error handler global ───────────────────────────────────────── YamlErrorHandler errh; errh.install(); // ── Parser y Tree reutilizados ──────────────────────────────────────────── ryml::EventHandlerTree handler; ryml::Parser parser(&handler); ryml::Tree tree; // ── Warm-up ─────────────────────────────────────────────────────────────── std::cout << "Warm-up (" << WARMUP << " iteraciones)...\n"; try { for (int i = 0; i < WARMUP; i++) { std::copy(content.begin(), content.end(), buf.begin()); // restaurar buffer ryml::substr yaml_src(buf.data(), content.size()); tree.clear(); ryml::parse_in_place(&parser, "test.yaml", yaml_src, &tree); } } catch (const std::exception& e) { std::cerr << "\nError en YAML:\n " << e.what() << "\n"; errh.uninstall(); return 1; } std::cout << "Warm-up OK\n\n"; // ── Benchmark ───────────────────────────────────────────────────────────── std::cout << "Benchmark (" << ITERS << " iteraciones)...\n"; double ms_total = 0.0; try { for (int i = 0; i < ITERS; i++) { std::copy(content.begin(), content.end(), buf.begin()); // restaurar buffer ryml::substr yaml_src(buf.data(), content.size()); tree.clear(); auto t0 = std::chrono::high_resolution_clock::now(); ryml::parse_in_place(&parser, "test.yaml", yaml_src, &tree); auto t1 = std::chrono::high_resolution_clock::now(); ms_total += std::chrono::duration(t1 - t0).count(); } } catch (const std::exception& e) { std::cerr << "\nError en YAML:\n " << e.what() << "\n"; errh.uninstall(); return 1; } errh.uninstall(); // ── Resultados ──────────────────────────────────────────────────────────── double ms_iter = ms_total / ITERS; double mb_s = (content.size() / 1024.0 / 1024.0) / (ms_total / 1000.0 / ITERS); std::cout << "\n=== Resultados ===\n"; std::cout << "Total : " << ms_total << " ms\n"; std::cout << "Media/iter : " << ms_iter << " ms\n"; std::cout << "Throughput : " << mb_s << " MB/s\n"; std::this_thread::sleep_for(std::chrono::seconds(10)); return 0; } Archivo : C:\Users\USER\Documents\te\twitter.json Tamanio : 631515 bytes (616.714 KB) Iteraciones : 1000 Warm-up (20 iteraciones)... Warm-up OK Benchmark (1000 iteraciones)... === Resultados === Total : 2846.55 ms Media/iter : 2.84655 ms Throughput : 211.575 MB/s */ //+------------------------------------------------------------------+