2026-08-02 21:55:37 +00:00
# Lista de cambios de JsonParserByLeo
En este documento se detallan todos los cambios presentes en el repositorio.
2026-10-03 22:50:43 -05:00
## Version (0.9.7) - (29/09/2026-3/10/2026)
2026-09-30 07:39:54 -05:00
2026-10-03 17:02:14 -05:00
### 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..
2026-09-30 07:39:54 -05:00
### 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..
2026-10-03 11:47:17 -05:00
7. 48ms de velocidad + en promedio
2026-09-30 07:39:54 -05:00
8. Ahora el parser consume menos memoria (las talbas de perfect hash se economizaron (seeds) etc..)
2026-10-03 11:47:17 -05:00
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.
2026-09-30 07:39:54 -05:00
### 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
2026-10-03 17:00:34 -05:00
3. Nueva funcion LastErr
2026-09-30 07:39:54 -05:00
### 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
2026-10-01 08:25:33 -05:00
### 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)
2026-09-30 07:39:54 -05:00
``` 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 ) ;
2026-10-02 22:01:54 -05:00
```
2026-09-30 07:39:54 -05:00
Si en cambio usas LastErr() pelado ahi si habria que llamar a CatchErr() si no LastErr=0 (no seteado)
2026-09-20 11:21:36 -05:00
## Version (0.9.6) - (18/09/2026 a 20/09/2026)
2026-09-18 14:11:09 -05:00
### Mejoras branchs-less
2026-09-20 08:48:58 -05:00
1. Hemos hecho un padding custom de 11 caracteres con valors centinela.. espeicales para evitar branchs
2026-09-18 14:11:09 -05:00
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
2026-09-20 11:21:36 -05:00
### 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
2026-08-26 19:48:01 -05:00
## Version (0.9.5) - 26/08/2026
2026-08-26 22:30:01 -05:00
### Mejoras en el parsing de numeros (y velocidad)
2026-08-26 19:48:01 -05:00
- 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...
2026-08-26 22:30:01 -05:00
- Tambien quite el static en ASMJson y de paso volvi a testear..
2026-08-03 15:14:26 -05:00
## Version (0.90.0) - 3/08/2026
2026-08-02 21:55:37 +00:00
Primera version documentada en el CHANGELOG las previas no tienen una versino documentada.
### Agregado
2026-08-04 09:07:11 -05:00
- SAX Style (YA listo para usar)
2026-08-03 15:14:26 -05:00
- Parse con SIMD via DLL
2026-08-02 21:55:37 +00:00
### 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
2026-08-26 19:48:01 -05:00
- Mejora leve en velocidad nuevo bajo alcanzado (662ms, previo: 663ms)