2010-12-09 22 views
5

¿Sabes cuál es la mejor forma de consumir tanto memoria como rendimiento?json_encode/json_decode vs Zend_Json :: encode/Zend_Json :: decode

Gracias de antemano.

Adiós.

+2

La "mejor manera" es descubrir usted mismo porque un punto de referencia tiene más sentido cuando se hace en una aplicación concreta en lugar de en un entorno aislado. Así que toma tu perfil y prueba. – Gordon

+0

Hoy, * Zend_Json * es solo una [función de envoltura] (https://en.wikipedia.org/wiki/Wrapper_function), y una ** biblioteca innecesaria overhad **. Hace 10 años también era un [proxy condicional] (https://en.wikipedia.org/wiki/Proxy_pattern) (una solución para la antigua falta de PHP en las funciones incorporadas de json). –

Respuesta

4

Zend_Json existe para que pueda integrarse mejor en un entorno OO. En cuanto al rendimiento, creo que json_encode/decode sería un poco más rápido, ya que están integradas en funciones (lo que significa que no están escritas en PHP).

+0

[Zend_Json usa json_encode debajo; es solo una capa para que puedas usarla mejor en una aplicación OO.] ¿Estás seguro? Eché un vistazo a Zend_Json_Encoder y no hay ninguna función json_encode, así que creo que Zend Json hace el trabajo. – Aly

+0

Interesante, lo hacen ellos mismos. Aparentemente estaba equivocado sobre eso. Revisaré mi respuesta. – Jonah

+1

@Jonah Tenía la misma impresión que tú, entonces la publicación de Aly me hizo echar un vistazo a la fuente y, curiosamente, no ajusta la función nativa ... (Y no puedo ver ningún código que alguna vez permita a ...). Todos los días son días de escuela –

5
$memoryNativeStart = memory_get_peak_usage (true); 
$start = microtime(true); 
$native = json_decode(json_encode($data)); 
$memoryNative = memory_get_peak_usage (true) - $memoryNativeStart; 
$jsonNativeTime = microtime(true) - $start; 
$msgNative = 'Native php <br>'; 
$msgNative .= 'time '.$jsonNativeTime.' memory '.$memoryNative.'<br>'; 

echo $msgNative; 

sleep(3); 

$memoryZendStart = memory_get_peak_usage (true); 
$start = microtime(true); 
$zend = Zend_Json::decode(Zend_Json::encode($data)); 
$memoryZend = memory_get_peak_usage (true) - $memoryZendStart; 
$jsonZendTime = microtime(true) - $start; 
$msgZend = 'Zend <br>'; 
$msgZend .= 'time '.$jsonZendTime.' memory '.$memoryZend; 

echo $msgZend; 

dentro de los datos que hay sobre 130.000 registros (con un conjunto de resultados)

consigo

Native php 

time 2.24236011505 memory 158072832 

Zend 

time 3.50552582741 memory 109051904 
+2

Todo el mundo debería considerar seriamente realizar sus propias pruebas de rendimiento aquí. 'Zend_Json' internamente usa' json_encode' y 'json_decode' también, solo si enciendes' Zend_Json :: $ useBuiltinEncoderDecoder' mides el rendimiento no nativo de la implementación real, y esto es muy muy malo (de 6 a 8 veces más lento a través de nuestro medidas aquí). –

+0

Y, para ser justos, existen algunos casos de uso poco frecuentes en los que no se quiere utilizar el idioma nativo, por ejemplo, si el codificador/decodificador nativo arroja algunas entradas UTF-8 "no conformes", como '\ 0' sin blindaje. No sé si estos son incluso legales, pero 'Zend_Json' no se atraganta con ellos y felizmente los codifica/descifra. –

6

La única diferencia en la funcionalidad es la siguiente (por la documentación de Zend Framework):

Cuando se implementa un método para Json() en un objeto a codificar, Zend_Json llama a este método y espera que el objeto devuelva un JSON representación de su estado interno.

Aparte de eso, no hay diferencias y elige automáticamente la funcionalidad json_encode de PHP si está instalada la extensión json. De sus documentos nuevamente:

Si ext/json no está instalado, la implementación de Zend Framework en código PHP se utiliza para la descodificación. Esto es considerablemente más lento que usar la extensión PHP, pero se comporta exactamente igual.

+1

Siento que la distinción que @mylesmg hace es importante. Zend_Json :: encode y Zend_Json :: decode ** son ** envoltorios de hecho para las funciones json_encode y json_decode nativas, excepto en la situación en que mylesmsg mencionó que el elemento que intentas codificar es un objeto con un método toJson.Si no está seguro de que la versión de PHP del entorno sea posterior a 5.2.0 (esto es cuando se agregó JSON al núcleo de PHP), usar Zend_Json será prudente. Pero de lo contrario, sería una sobrecarga innecesaria. PD: disculpas si estoy resucitando un tema viejo. Solo que la pregunta surgió con mis colegas. –

+0

Acepto, desde 2006 Zend_Json "sería una sobrecarga innecesaria" ... Pero debe ser enfático, hoy, 10 años después (!), ** Zend_Json es una carga innecesaria **. –