Rendimiento
Compresión JSON: mide gzip y Brotli con tus datos
Ejecuta un benchmark Node descargable, compara bytes UTF-8 y tiempo de lectura y decide si merece la pena probar un formato binario.
Antes de cambiar el formato de una API, separa tres costes: bytes transferidos, trabajo de compresión en el emisor y descompresión más parseo en el receptor. El archivo más pequeño puede empeorar la latencia o la compatibilidad del sistema.
Una prueba que puedes repetir
Descarga compression-benchmark.mjs. Sólo utiliza módulos incluidos en Node. Ejecútalo con Node 22 o posterior:
node compression-benchmark.mjs
node compression-benchmark.mjs ./sample.json
Sin argumento genera 1.000 registros con id, name, city: "Málaga" y active. Es una muestra deliberadamente repetitiva, no una representación de todas las API. Si indicas un archivo, lee ese JSON local; no hace peticiones de red.
Compara JSON con sangría, JSON compacto, gzip nivel 6 y Brotli calidad 4. Comprueba que ambas variantes comprimidas recuperan exactamente los bytes de entrada. Incluye las versiones de Node y de las bibliotecas de compresión en el resultado para registrar el entorno.
Desplázate horizontalmente para ver todas las columnas.
| Resultado | Qué mide |
|---|---|
bytes.pretty / bytes.compact |
Bytes UTF-8, con / sin espacios de formato |
bytes.gzip6 / bytes.brotli4 |
JSON compacto comprimido, incluidas sus cabeceras |
meanMsPerOperation |
Tiempo medio de lectura y parseo: 1.000 iteraciones tras 100 de calentamiento |
roundTrip |
Igualdad exacta de los bytes recuperados |
Prueba un mensaje pequeño y una respuesta realista de tu aplicación. Utiliza datos sintéticos o anonimizados. Repite la ejecución y observa la variación. El script es síncrono y sirve para experimentar localmente, no para atender peticiones de producción. No mide latencia de red, memoria máxima ni rendimiento con concurrencia.
Cuenta bytes, no caracteres JavaScript
const text = '{"city":"Málaga"}';
console.log(text.length); // 17 unidades UTF-16
console.log(Buffer.byteLength(text)); // 18 bytes UTF-8
El formateador permite quitar espacios. Esa minificación es distinta de gzip o Brotli: el documento compacto sigue repitiendo nombres de propiedades que el compresor puede aprovechar. Un mensaje diminuto puede crecer al añadir las cabeceras de compresión.
Cuándo considerar MessagePack o CBOR
Ofrecen representaciones binarias y tipos adicionales al subconjunto portable de JSON. Ambos extremos necesitan codificadores compatibles. Tiene sentido probarlos si importan los valores binarios, la fidelidad de tipos o las restricciones del transporte; no tienen una ventaja universal de tamaño o velocidad.
Compara los mismos datos, ajustes de compresión, versiones y recorrido completo de codificación y lectura. Comparar binario sin comprimir con JSON comprimido no equivale a utilizar el mismo transporte. Protocol Buffers añade la gestión de un esquema: no sustituye automáticamente un endpoint JSON público.
Llevar la decisión a la aplicación
Comprueba Content-Encoding y Vary en respuestas reales. No todos los servidores o CDN activan compresión automáticamente. Conserva una salida legible si los clientes requieren JSON. Al recibir datos, limita tanto los bytes transferidos como los descomprimidos: un archivo pequeño puede expandirse mucho.
Referencias: compresión en Node, MessagePack y CBOR RFC 8949. Para entradas que no caben cómodamente en memoria, consulta streaming JSON: comprimir en disco no elimina el coste del objeto descomprimido.
Herramientas relacionadas
Preguntas frecuentes
¿gzip siempre reduce un JSON?
No. La compresión añade cabeceras y puede aumentar un mensaje pequeño o datos ya comprimidos. Compara los bytes reales.
¿El tiempo publicado es una mediana?
No. El ejemplo calcula milisegundos medios por operación después del calentamiento. Repite las pruebas en tu equipo de destino; no mide latencia HTTP.