2011-03-14 18 views
12

Estamos creando una aplicación que utiliza una gran cantidad de análisis XML y pensé que tal vez para usar JSON, porque podemos usar JSON como una alternativa a XML.Velocidad de análisis JSON vs XML en Delphi

Necesito probar cuál es más rápido JSON o XML, pero pensé en pedir una opinión aquí primero.

JSON en JavaScript es nativa y es rápida. Ciertamente más rápido que analizar XML. Pero en Delphi no hay clases nativas para hacer eso.

Así que mi pregunta es, ¿cuál es más rápido en Delphi, usando la biblioteca de análisis XML o JSON? ¿O son iguales en velocidad?

Y si es más rápido que el que prefiere - Delphi Web Utils, JSON Delphi Library o JSON Toolkit

Respuesta

11

Con un analizador bien escrito, XML y JSON tendrá más o menos el mismo tiempo. Puede tener un analizador JSON lento y un analizador XML rápido.

Quizás un poco más lento para XML porque la sintaxis es más compleja que la de JSON.

Pero el cuello de botella se leerá principalmente desde el disco duro, sin analizar el contenido.

Utilizamos JSON para el Cliente/Servidor de nuestra ORM, por varias razones (pero encontrará otros, yo no quiero para recorrer aquí, sólo hablan de nuestro pequeño experimento):

  • Al igual que XML, se trata de un formato de lectura humana basado en texto para representar estructuras de datos simples y matrices asociativas (objetos llamados);
  • Es más fácil de leer (para los seres humanos y las máquinas), más rápido de implementar, y generalmente de menor tamaño que XML;
  • Es un formato muy eficiente para el almacenamiento en caché de datos;
  • Su diseño permite reescribirse en lugar de cadenas UTF-8 terminadas en cero individuales, con casi ningún espacio perdido: esta característica se utiliza para programar JSON rápido a la conversión de texto de los resultados de tablas, sin asignación de memoria ni copia de datos ;
  • Tiene el soporte nativo del lenguaje JavaScript, por lo que es un formato de serialización perfecto en cualquier aplicación AJAX (es decir, Web 2.0);
  • El formato JSON se especifica en un RFC bien conocido y simple;
  • La codificación de texto predeterminada para JSON y nuestro ORM es UTF-8, que permite que el juego de caracteres Unicode completo se almacene y se comunique;
  • Es el formato de datos predeterminado utilizado por los servicios ASP.NET AJAX creados en Windows Communication Foundation (WCF) desde .NET Framework 3.5; entonces Microsoft está oficialmente "listo";
  • Para la transmisión de blobs binarios, no hay CDATA como en XML. Así que simplemente codificamos los datos binarios como hexadecimales o Base64 (usa menos espacio) dentro de una cadena JSON.

Acerca de la velocidad de análisis, puede echar un vistazo a nuestra in-place parser and JSON writer from SQLite3 results. Estaba muy optimizado para la velocidad, y rápido es. Escribimos un simple pero efficient JSON serialization para cualquier TPersistent, incluidas las colecciones. Simplemente agregamos a dynamic array JSON serializer, que también es muy rápido.

Nota adicional:

Todos los analizadores difieren de la que usted ha mencionado, ya que analizan el contenido JSON y formato como texto dentro de la memoria intermedia de entrada: no hay ninguna asignación de memoria realizado durante el análisis, así que debe ser más rápido que otras soluciones. El contenido del texto no está guardado, los campos tienen el # 0 finalizado y se calcula un puntero al principio del texto. Entonces, para acceder a un valor, solo usa el puntero para obtener los datos. Por lo general, analiza algunos MB de contenido JSON sin tiempo.

También eche un vistazo a JSON parser embedded in DWS. El autor afirmó que era rápido. Pero aún asignó un bloque de memoria para cada objeto.

+0

Acerca de nuestro análisis en contexto JSON en el lugar, y las técnicas del analizador DOM/SAX XML, puede consultar http://blog.synopse.info/post/2011/06/02/Fast-JSON-parsing –

+0

@ Bouchez: ¿tu analizador JSON está disponible para que otros lo usen? En caso afirmativo, ¿podría proporcionar los enlaces para descargarlo? Gracias – costa

+0

El analizador está disponible en nuestra [unidad SynCommons.pas] (http://synopse.info/fossil/finfo?name=SynCommons.pas), como un conjunto de funciones de bajo nivel. No hay clases de alto nivel capaces de convertir directamente cualquier tipo de contenido JSON en un árbol, ya que tratamos de evitar dicha memoria y el proceso de consumo de CPU en mORMot, y confiamos en objetos simples o matrices. Pero tiene poderosas funciones JSONToObject() y ObjectToJSON(). –