//+------------------------------------------------------------------+ //| BenJsonLib.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 //#define JSONBENCH_RUN_MIX //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ #include #include "Def.mqh" #define LIBNAME "MQL5-JsonLib" //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- #ifdef JSONBENCH_RUN_PARSE MQL5_Json::JsonError error; MQL5_Json::JsonParseOptions opts; opts.engine = MQL5_Json::ENGINE_HIGH_SPEED; //--- MQL5_Json::Internal::CJsonRapidParser rapid_parser; rapid_parser.m_text = g_json_data; // one copy rapid_parser.m_text_len = StringLen(g_json_data); //--- Sleep(1000); //--- ulong a = GetMicrosecondCount(); for(int i = 0; i < 1000; i++) { rapid_parser.ParseToTapeFast(opts, error); MQL5_Json::Internal::CJsonDocument doc_impl; // o como corresponda instanciar MQL5_Json::Internal::CDomBuilder dom_builder; dom_builder.BuildFromTape(GetPointer(doc_impl), rapid_parser.m_tape, g_json_data); } ulong b = GetMicrosecondCount() - a; Print("@", b); #else // JSONBENCH_RUN_PARSE MQL5_Json::JsonError error; MQL5_Json::JsonParseOptions opts; MQL5_Json::JsonDocument doc = MQL5_Json::JsonParse(g_json_test_access, error, opts); MQL5_Json::JsonNode root = doc.GetRoot(); #ifdef JSONBENCH_RUN_MIX string keys[]; root.Get("wide_object").GetKeys(keys); const int n = ArraySize(keys); TSN::CRandom xo; xo.Seed(JSONBENCH_ACCESO_XHOR_SEED); 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.Get("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.Get("deep_object").Get("l1").Get("l2").Get("l3").Get("l4").Get("l5") .Get("l6").Get("l7").Get("l8").Get("l9").Get("l10").Get("target").AsString(); } 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.Get("large_array").At(index).AsInt(0); } b = GetMicrosecondCount(); Sleep(100); JSONBENCH_ACCES_CALL(JSONBENCH_TAGOP_ACCESO_LARGE_ARR) a = GetMicrosecondCount(); for(int k = 0; k < 500; k++) { sump += root.Get("array_of_objects").At(k).Get("price").AsDouble(0.0); profit += root.Get("array_of_objects").At(k).Get("profit").AsDouble(0.0); const int s = root.Get("array_of_objects").At(k).Get("tags").Size(); tin += StringLen(root.Get("array_of_objects").At(k).Get("tags").At(k % s).AsString()); } b = GetMicrosecondCount(); Sleep(100); JSONBENCH_ACCES_CALL(JSONBENCH_TAGOP_ACCESO_MIX) PrintFormat("sump=%.2f profit=%.2f tin=%d ", sump, profit, tin); #else // JSONBENCH_RUN_MIX MQL5_Json::Internal::CJsonSerializer s; MQL5_Json::Internal::CJsonValue* _root = doc._GetImpl().m_root; ulong a = GetMicrosecondCount(); for(int i = 0; i < 5; i++) { s.Serialize__Mod(_root,false,false); } ulong b = GetMicrosecondCount() - a; Sleep(100); b*=200; // para que llegue a 100 iteraciones // lo puse asi dado qeu es bien lento JSONBENCH_SER #endif // JSONBENCH_RUN_MIX JSONBENCH_FINISH #endif // JSONBENCH_RUN_PARSE } //+------------------------------------------------------------------+ /* hice algunas modicaciones para uqe no retorne el string void CJsonSerializer::Serialize__Mod(const CJsonValue *root, bool p, bool e) { // 每次调用都重置内部状态,确保线程安全和结果纯净 m_result_str = ""; m_pretty = p; m_escape_non_ascii = e; SerializeValue(root, 0); // 从根节点开始递归 // return m_result_str; } */ /* 2026.10.03 15:16:12.200 BenJsonLib (EURUSD,H1) [acceso-wide] Time: 236 2026.10.03 15:16:12.312 BenJsonLib (EURUSD,H1) [acceso-deep] Time: 1016 2026.10.03 15:16:12.422 BenJsonLib (EURUSD,H1) [acceso-array-large] Time: 415 2026.10.03 15:16:12.534 BenJsonLib (EURUSD,H1) [acceso-mixed-trading] Time: 1125 2026.10.03 15:16:12.534 BenJsonLib (EURUSD,H1) sump=537.48 profit=-337.50 tin=4927909 2026.10.03 15:16:13.505 BenJsonLib (EURUSD,H1) [acceso-wide] Time: 240 2026.10.03 15:16:13.617 BenJsonLib (EURUSD,H1) [acceso-deep] Time: 1023 2026.10.03 15:16:13.727 BenJsonLib (EURUSD,H1) [acceso-array-large] Time: 548 2026.10.03 15:16:13.837 BenJsonLib (EURUSD,H1) [acceso-mixed-trading] Time: 1085 2026.10.03 15:16:13.837 BenJsonLib (EURUSD,H1) sump=537.48 profit=-337.50 tin=4927909 2026.08.28 09:34:19.945 BenJsonLib (EURUSD,H1) @2160719 2026.08.28 09:34:29.912 BenJsonLib (EURUSD,H1) @2118729 2026.08.28 09:36:20.789 BenJsonLib (EURUSD,H1) @12879 2026.08.28 09:37:24.614 BenJsonLib (EURUSD,H1) @17595195 2026.08.28 09:39:02.251 UtilHeader (EURUSD,H1) [MultiBen& - $[parse|twitter.json|MQL5-JsonLib|1000] 2026.08.28 09:39:28.038 BenJsonLib (EURUSD,H1) @17547384 2026.08.28 09:39:51.584 BenJsonLib (EURUSD,H1) @17760505 2026.08.28 09:40:04.740 UtilHeader (EURUSD,H1) [MultiBen& - %[MQL5-JsonLib] 2026.10.03 16:51:13.942 BenJsonLib (EURUSD,H1) [Serilization] Time: 4534365593 2026.10.03 16:51:47.443 BenJsonLib (EURUSD,H1) [Serilization] Time: 4503261352 */ //+------------------------------------------------------------------+