| # Lista de cambios de JsonParserByLeo
|
| En este documento se detallan todos los cambios presentes en el repositorio.
|
|
|
| ## Version (0.9.7) - (29/09/2026-3/10/2026)
|
|
|
| ### General
|
| 1. Se ha quitado la funciondaldi JSON Asm consideramos que a este punto esta siendo mas una carga que algo util..
|
| incialmente mi idea era un formatdo de parsear mas rapido que json pero que use el mismo backend de cinta y CJsonNode
|
| al final si lo fue pero por pcoco 10-15ms casi nada... y justificaiba manteer tablas, etc etc...
|
| aparte que no lo usbaa por mi parte lo meti "por si acaso" y creo que es hora de sacarlo..
|
|
|
| ### Json Normal
|
| 1. Mejoras en acceso a [] array, ya no se activa el JIT en pocos elementos (tambien configurable via defines)
|
| 2. Algoritmo perfect hash mejorado (PerfectHashByLeo)
|
| 3. Agregato soporte a ulong (nuevo tipo en json y basesparserslan), por lo que para ids grandes
|
| ya no se pierde precision.
|
| 4. Parser mejorado en parsing de numeros integers y reales (+fast | +seguro | +preciso), ahora ya se valida los
|
| numeros completamente... leading zeros, buena fomracino de exp, decimal, etc... aparte de que si el parser
|
| considera que ya no puede represetar un numero bien sin perder precision optara por guardarlo como string.
|
| y ud como usuario ya puede decisidir si trbajarlo como string o usar una lib de big-integer\decimal si asi lo decea.
|
| 5. Ahora ya hay valiudacion para true\false\null completa, no solo avanzes.
|
| 6. Nuevos codigos de errores..
|
| 7. 48ms de velocidad + en promedio
|
| 8. Ahora el parser consume menos memoria (las talbas de perfect hash se economizaron (seeds) etc..)
|
| 9. ahora por defecto para keys ya no se usa swar
|
| 10. Parsing de numeros mas preciso.. que la version inical del 30/09/2026 ahora ya se hace divsion (Antes se multiplicaba por el inverso)
|
| por lo que habia perdida de precision (de algunos decimales).. ahora esto ya no ocurre.
|
|
|
| ### Json SAX
|
| 1. Agregadas nuevas funciones OnBigDecimal, OnBigInteger que dan offset\len al usuario...
|
| este ya decide que hacer con numeros que el parser considera peligrosos para poder convertirlos a double\long
|
| 2. Ahora tambien el parser valida true\false\null
|
| 3. Nueva funcion LastErr
|
|
|
| ### Funcionalidad
|
| La funcionalidad se mantiene igual pero para no contaminar todo el hot path algunos errores (4 en especifico)
|
| se tendran que capturar via CatchErr... una vez que parse retorne false.. asi que es el patorn segurido es:
|
|
|
| Si en caso usas error info tal cual.. nada que cambiar.. errorinfo internamete ya usa catherr
|
|
|
| ### Unescape
|
| Se mejoro el unescape en string\uarray\jsonpointer ahora ya tira errores en caso de escapes invalidos
|
| o \uXXXX sin los 4 X... antes no tiraba error alguno... (aplica a ToString* etc.. NO aplica a ComplexTo*
|
| esta funcion solo extrae una porcion del json original.. no hay un desescape o algo asi..
|
| si hace falta un seriliaze se podir ahacer uno usando complex data... por ahora no..
|
| dado qe no le veo un caso de uso)
|
|
|
| ```mql5
|
| TSN::CJsonParser parser;
|
| parser.Assing("{\"symbol\":\"EURUSD\",\"bid\":1.2345,\"ask\":1.2347,\"active\":true}");
|
| parser.CorrectPadding();
|
| if(!parser.Parse())
|
| {
|
| Print("error en parseo de json: ");
|
| parser.ErrorInfo();
|
| }
|
|
|
| TSN::CJsonNode root = parser.GetRoot();
|
| string symbol = root["symbol"].ToString();
|
| double bid = root["bid"].ToDouble(0.0);
|
| bool active = root["active"].ToBool(false);
|
|
|
| ```
|
|
|
| Si en cambio usas LastErr() pelado ahi si habria que llamar a CatchErr() si no LastErr=0 (no seteado)
|
|
|
|
|
| ## Version (0.9.6) - (18/09/2026 a 20/09/2026)
|
|
|
| ### Mejoras branchs-less
|
| 1. Hemos hecho un padding custom de 11 caracteres con valors centinela.. espeicales para evitar branchs
|
| la idea con esto es quitarnos los ifs extra que teniamos en el parsing de comillas y strgins
|
| luego de que avanzaremos de a chunks.. siendo asi que haremos reducido 2 ramas en hot path
|
| a una unica rama al final... de chekeo
|
| 2. hemos mejorado ligeramente el parsing de numeros
|
| 3. Nuevo modo para contar valores ya no depende de , + un branch en obj end si no por valores reales.
|
|
|
|
|
| ### Correciones de bugs
|
| 1. En sax en el parseo del valor luego del E+\-* justo donde empiza * hay un numero entonces ahi
|
| no lo llegaba a parsear
|
|
|
| ### Mas seguro
|
| 1. Hemos mejorado el padding, para evitar errores en casos como:
|
| - key no cerradas (ahi daba un fuera de rango)
|
| - Json truncado malfordadmo como "{" o "[" solos.. ahi tambien da un error antes fuera de rango
|
| Todo esto debeido a que el padding ya no solo es ws (espacios)..
|
|
|
| ### Mas rapido (cerca del techo)
|
| Ahora que quitamos mas branchs y "postergamos" su veriicacion...
|
| hemos bajado 9ms mas en mql5
|
| y algo de 20-19 ms en cpp.... creo que apartir de aqui ya casi casi se nos sera muy impsible seguir bajando... en MQL5 puro estamos
|
| casi casi a tope.
|
| Debido a esto he actulizado los benchs
|
|
|
| ### Tambien
|
| 1. Hemos abstriaos el tema del Escape para json metilo en JsonEscape con funciones rueltizaes qeu ahora se reutlizaran en JsonDomSerilziaes
|
| y los buildes, la idea es tambine ser limpios no retpir codigo por qeu si... tambien un par de mejoras para vevitar copias de strigns
|
| en los builders
|
|
|
| ## Version (0.9.5) - 26/08/2026
|
|
|
| ### Mejoras en el parsing de numeros (y velocidad)
|
| - He mejorado el parsing de numeros, quitando la rama de if(ch == '-') esto lo logre añadiendo un nuevo case
|
| TSN_JSON_TOK_NUMBER_NEG este maneja esclusivamente los numeros negativos (en si el cuerpo como dije )
|
| lo extraje en un macro (inline) comun y lo que logre con esto es evitar esa rama
|
| dado que mask se calcual ya en compilacion no en ejeuccion... (debido a esa sepacio)
|
| con esto logramos 1ms mas de mejoa (661ms) nuevo minimo...
|
| Sinceramnte creo qeu quizas ya estoy en el techo de lo que puedo alcanzar en MQL5 puro
|
| no veo mas cosas a mejorar.. ramente se me ocurre algo... pero hoy me levante con ideas
|
| viendo si puedo eliminar un if o no.. lo malo de este nuevo agregado es que dupliqeu codigo
|
| pero como aqui prorizamos maxima velocidad no resulta un problema.
|
|
|
| - Debido al primer punto que mecione intrudje mejoras al sax de paso
|
| ahi tambien quiente un branch y m_in se usa exclusivamnte para el case de dbl
|
| ya no para integers...
|
|
|
| - Tambien quite el static en ASMJson y de paso volvi a testear..
|
|
|
| ## Version (0.90.0) - 3/08/2026
|
| Primera version documentada en el CHANGELOG las previas no tienen una versino documentada.
|
|
|
| ### Agregado
|
| - SAX Style (YA listo para usar)
|
| - Parse con SIMD via DLL
|
|
|
| ### Mejorado
|
| - Nuevo algoritmo para encontrar el fin de un string (mas fast)
|
| - Ahora ya no se usa una tabla de transicion si no qeu el mismo curr state y otras macros definen los tipos validos (mas fast, menos accceso, ya no ser usa una varialble de locks y menos operaciones or)
|
| - m_curr_state pasa a llevar banderas
|
| - Mejora leve en velocidad nuevo bajo alcanzado (662ms, previo: 663ms)
|