| //+------------------------------------------------------------------+
|
| //| UtilFinish.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 MQLARTICLES_MBEN_ENABLE_FINAL_FLUSH
|
|
|
| //+------------------------------------------------------------------+
|
| //| |
|
| //+------------------------------------------------------------------+
|
| #include "Def.mqh"
|
|
|
| //+------------------------------------------------------------------+
|
| //| |
|
| //+------------------------------------------------------------------+
|
| #ifndef FINISH_BENCH_LOGFILE
|
| //+------------------------------------------------------------------+
|
| //| Datos recolectados del log 20260828.log (parse|twitter.json) |
|
| //+------------------------------------------------------------------+
|
| struct SBenchResult
|
| {
|
| string tag;
|
| string dataset;
|
| string lib_name;
|
| int iter;
|
| long total;
|
| };
|
|
|
| SBenchResult s_bench_data[] =
|
| {
|
| {"parse", "twitter.json", "JsonParserByLeo", 1000, 647487},
|
| {"parse", "twitter.json", "FastJson", 1000, 1213429},
|
| {"parse", "twitter.json", "JAson", 1000, 21118681},
|
| {"parse", "twitter.json", "MQL5-JsonLib", 1000, 17547384},
|
| {"parse", "twitter.json", "JsonParserByLeo-ASM", 1000, 637971},
|
| {"parse", "twitter.json", "ClaudeFableJson-OnePass", 1000, 1060569},
|
| {"parse", "twitter.json", "ClaudeFableJson-3+Pass", 1000, 1063043},
|
| {"parse", "twitter.json", "GLM", 1000, 1249760},
|
| {"parse", "twitter.json", "ToyJson3", 1000, 4859},
|
| {"parse", "twitter.json", "CJsonNode_MQL5Articles", 1000, 86409036} // agregado manualmente: ciclo sin cierre "%" en el log, unico valor @ capturado
|
| };
|
|
|
|
|
| //+------------------------------------------------------------------+
|
| //| Guarda los resultados de s_bench_data en la base de datos comun |
|
| //+------------------------------------------------------------------+
|
| void SaveBenchResultsToDB(const string name)
|
| {
|
| const int sql_handle = DatabaseOpen(name, DATABASE_OPEN_COMMON | DATABASE_OPEN_CREATE | DATABASE_OPEN_READWRITE);
|
| if(sql_handle == INVALID_HANDLE)
|
| {
|
| FastLog(FUNCION_ACTUAL, FATAL_ERROR_TEXT, StringFormat("Fallo al abrir la db [%s], last err = %d",
|
| name, ::GetLastError()));
|
| return;
|
| }
|
|
|
| //--- creamos si no existe
|
| if(!DatabaseExecute(sql_handle, g_mqlarticles_mben_sql_init))
|
| {
|
| DatabaseClose(sql_handle);
|
| FastLog(FUNCION_ACTUAL, FATAL_ERROR_TEXT, StringFormat("Fallo al crear la tabla db, last err = %d", ::GetLastError()));
|
| return;
|
| }
|
|
|
| //--- Iniciamos
|
| ::ResetLastError();
|
| if(!DatabaseTransactionBegin(sql_handle))
|
| {
|
| DatabaseClose(sql_handle);
|
| FastLog(FUNCION_ACTUAL, FATAL_ERROR_TEXT, StringFormat("Fallo al inicar transacion datos al m_sql_handle: ", ::GetLastError()));
|
| return;
|
| }
|
|
|
| //---
|
| ::ResetLastError();
|
| const int stmt = DatabasePrepare(sql_handle, g_mqlarticles_mben_sql_insert);
|
| if(stmt == INVALID_HANDLE)
|
| {
|
| DatabaseClose(sql_handle);
|
| FastLog(FUNCION_ACTUAL, FATAL_ERROR_TEXT, StringFormat("Fallo al ejeuctar un preprare de la base de datos, ultimo err = %d",
|
| ::GetLastError()));
|
| return;
|
| }
|
|
|
| //---
|
| const string run_date = TimeToString(TimeLocal(), TIME_DATE);
|
| const int total = ArraySize(s_bench_data);
|
| for(int i = 0; i < total; i++)
|
| {
|
| DatabaseReset(stmt);
|
| DatabaseBind(stmt, 0, run_date);
|
| DatabaseBind(stmt, 1, s_bench_data[i].tag);
|
| DatabaseBind(stmt, 2, s_bench_data[i].dataset);
|
| DatabaseBind(stmt, 3, s_bench_data[i].lib_name);
|
| DatabaseBind(stmt, 4, s_bench_data[i].iter);
|
| DatabaseBind(stmt, 5, s_bench_data[i].total);
|
| DatabaseRead(stmt);
|
| }
|
|
|
| //---
|
| DatabaseFinalize(stmt);
|
|
|
| //---
|
| ::ResetLastError();
|
| if(!DatabaseTransactionCommit(sql_handle))
|
| {
|
| DatabaseClose(sql_handle);
|
| FastLog(FUNCION_ACTUAL, FATAL_ERROR_TEXT, StringFormat("Fallo al enviar datos al m_sql_handle: ", ::GetLastError()));
|
| return;
|
| }
|
|
|
| //---
|
| DatabaseClose(sql_handle);
|
| }
|
| #endif
|
|
|
| //+------------------------------------------------------------------+
|
| //| Script program start function |
|
| //+------------------------------------------------------------------+
|
| void OnStart()
|
| {
|
| #ifdef FINISH_BENCH_LOGFILE
|
| TSN::CMultiBenchmark::ParseLogFileTodayFlushDb(JSONBENCH_DB_NAME);
|
| #else
|
| SaveBenchResultsToDB(JSONBENCH_DB_NAME);
|
| #endif // FINISH_BENCH_LOGFILE
|
| }
|
| //+------------------------------------------------------------------+
|