BookinglyTech News
Software

Go 1.27 trae nuevo paquete JSON que acelera el marshal en 1.5‑3x y el unmarshal en 1.5‑2.3x

El paquete encoding/json/v2 de Go 1.27 promete mejoras significativas en el rendimiento de serialización y deserialización JSON, aunque con diferencias según el tipo de datos y la API usada.

2 min de lecturaLobsters0 vistas

Go 1.27 incluye por defecto un nuevo paquete JSON, encoding/json/v2, que reemplaza al antiguo encoding/json en cuanto a rendimiento. El cambio no es un reemplazo directo: las nuevas API difieren en validación de Unicode y sensibilidad a mayúsculas, por lo que el API legacy sigue siendo usable sobre el nuevo motor mediante la bandera GOEXPERIMENT=nojsonv2.

Los tres escenarios disponibles son:

  • json (legacy) – encoding/json construido con GOEXPERIMENT=nojsonv2, la implementación original.
  • json (Go 1.27) – encoding/json de la versión 1.27, con la API v1 sobre el nuevo motor.
  • json/v2 – encoding/json/v2, la nueva API.

Pruebas en documentos simdjson (twitter.json 632 kB, canada.json 2.25 MB, citm_catalog.json 1.73 MB) se realizaron en un Apple M4 Max y un Intel Xeon Gold 6548N, con GOMAXPROCS=1, midiendo la mediana de ocho ejecuciones.

Resultados de unmarshalling:

  • Legacy API sobre el nuevo motor: 172 MB/s → 203 MB/s en twitter.json, 186 MB/s → 241 MB/s en citm_catalog.json, pero 128 MB/s → 106 MB/s en canada.json.
  • json/v2 frente a la original: 1.5 × a 2.3 × más rápido.
  • json/v2 frente a la legacy API de 1.27: 1.8 × a 2 × más rápido.

Resultados de marshalling:

  • Legacy API sobre el nuevo motor: 198 MB/s → 374 MB/s en twitter.json.
  • json/v2 frente a la original: 1.2 × a 3 × más rápido.
  • json/v2 frente a la legacy API de 1.27: 1.0 × a 1.7 × más rápido.

Para estructuras tipadas, se midió una slice de 10 000 registros con un esquema fijo. En ese caso, el unmarshalling sigue siendo más rápido con json/v2, pero el marshalling vuelve a ser más eficiente con la implementación legacy de Go 1.27.

En resumen, simplemente actualizar a Go 1.27 mejora el marshalling sin cambios de código, mientras que usar encoding/json/v2 aporta mejoras sustanciales en el unmarshalling y, en algunos casos, en el marshalling, especialmente cuando se trabaja con datos genéricos (interface{}). El rendimiento depende de la carga de trabajo y de si se serializan estructuras tipadas o datos sin esquema.

El código de pruebas está disponible en el repositorio del autor para que se pueda reproducir y extender el benchmark.