Muy buen tema y después de leer las pocas respuestas, quiero compartir mis experimentos sobre el tema.
Obtuve un caso de uso en el que se debe consultar una tabla "enorme" casi cada vez que hablo con la base de datos (no pregunte por qué, solo un hecho). El sistema de almacenamiento en caché de la base de datos no es apropiado ya que no almacenará en caché las diferentes solicitudes, así que pensé en los sistemas de almacenamiento en caché de php.
Lo intenté apcu
pero no se ajustaba a las necesidades, la memoria no es lo suficientemente confiable en este caso. El siguiente paso fue almacenar en caché un archivo con serialización.
La tabla tiene 14355 entradas con 18 columnas, esas son mis pruebas y estadísticas sobre la lectura del caché serializado:
JSON
Como todos dijeron, el mayor inconveniente con json_encode
/ json_decode
es que transforma todo en una StdClass
instancia (u Objeto). Si necesita hacer un bucle, lo que probablemente hará es transformarlo en una matriz, y sí, aumenta el tiempo de transformación
tiempo promedio: 780.2 ms; uso de memoria: 41.5MB; tamaño del archivo de caché: 3.8MB
Msgpack
@hutch menciona msgpack . Bonito sitio web. Vamos a intentarlo, ¿de acuerdo?
tiempo medio: 497 ms; uso de memoria: 32 MB; tamaño del archivo de caché: 2.8MB
Eso es mejor, pero requiere una nueva extensión; compilando a veces personas asustadas ...
IgBinary
@GingerDog menciona igbinary . Tenga en cuenta que lo configuré igbinary.compact_strings=Off
porque me importa más leer interpretaciones que el tamaño de archivo.
tiempo promedio: 411.4 ms; uso de memoria: 36.75MB; tamaño del archivo de caché: 3.3MB
Mejor que el paquete de mensajes. Aún así, este también requiere compilación.
serialize
/ /unserialize
tiempo medio: 477,2 ms; uso de memoria: 36.25MB; tamaño del archivo de caché: 5.9MB
Mejores rendimientos que JSON, cuanto más grande es la matriz, más lento json_decode
es, pero eso ya lo sabes.
Esas extensiones externas están reduciendo el tamaño del archivo y parece genial en papel. Los números no mienten *. ¿Cuál es el punto de compilar una extensión si obtienes casi los mismos resultados que tendrías con una función PHP estándar?
También podemos deducir que, según sus necesidades, elegirá algo diferente a otra persona:
- IgBinary es realmente agradable y funciona mejor que MsgPack
- Msgpack es mejor para comprimir sus datos (tenga en cuenta que no probé la opción igbinary compact.string).
- ¿No quieres compilar? Utiliza estándares.
¡Eso es todo, otra comparación de métodos de serialización para ayudarlo a elegir uno!
* Probado con PHPUnit 3.7.31, php 5.5.10: solo decodificación con un disco duro estándar y una CPU de doble núcleo antigua: números promedio en 10 pruebas de casos de uso iguales, sus estadísticas pueden ser diferentes
JSON_UNESCAPED_UNICODE
.