2010-06-15 20 views
18

per un determinato progetto, ho bisogno di un modo per analizzare XML e ottenere dati da esso. Quindi mi chiedo, quale tra i parser integrati è il più veloce?Qual è il parser XML più veloce in PHP?

Inoltre, sarebbe bello che il parser potesse accettare una stringa XML come input: ho una mia implementazione di thread-safe che funziona con i file e non voglio alcune cattive librerie non thread-safe per rendere il mio sforzi inutili.

+1

è thread-sicurezza davvero un problema? Il 99% delle applicazioni PHP sono a thread singolo. –

+0

Sono abbastanza sicuro che stia parlando delle condizioni di gara [basate su un'altra sua domanda] (http://stackoverflow.com/questions/3030122/is-splfileobject-atomic/3048658#3048658). – Charles

+0

Ho paura che lo sia. Suppongo che userò SimpleXML. Non ho idea delle sue prestazioni, comunque. –

risposta

8

Il parser più veloce sarà SAX: non è necessario creare un dom e può essere eseguito con xml parziale o progressivo. Informazioni su PHP SAX parser (Expat) can be found here. In alternativa c'è un libxml based DOM parser named SimpleXML. Un parser basato su DOM sarà più semplice da utilizzare ma in genere è più lento di alcuni ordini di grandezza.

+0

concordato. Prestazioni imbattibili in modalità streaming, consumo di memoria molto basso. Per XMLs feed-like o ripetitivi la scelta migliore. Guarda l'esempio su http://www.php.net/manual/en/function.xml-parse.php. Testato su 10MB XML, tempo di analisi circa 3 secondi su notebook I7 incluso negozio su tabella piatta MySQL con indice di testo completo, heap di picco utilizzato a circa 600kB (!) – OSP

+6

Se solo ... Molti dei nostri clienti aziendali passano solo da CSV a XML e penso che JSON sia un tizio dai conti. – Tamlyn

0

Non ci sono molti parser in PHP.

I più efficaci saranno quelli forniti con PHP, scrivere un benchmark con DOM e SimpleXML e verificare quale sia la migliore.

+7

Non solo eseguire benchmark, benchmark e pubblicare dati di test, metodi di test e risultati! – Charles

2

Ogni estensione XML ha i suoi punti di forza e di debolezza. Ad esempio, ho uno script che analizza il dump dei dati XML da Stack Overflow. Il file posts.xml è 2,8 GB! Per questo grande file XML, ho dovuto usare XMLReader perché legge XML in una modalità di streaming, invece di provare a caricare e rappresentare l'intero documento XML in memoria in una volta, come fa l'estensione DOM.

Quindi è necessario essere più specifici sulla descrizione di come si utilizzerà l'XML, al fine di decidere quale estensione PHP utilizzare.

Tutte le estensioni XML di PHP forniscono un metodo per leggere i dati XML come una stringa.

+0

Cosa consiglieresti come il più veloce per caricare molti piccoli file xml? –

+0

@JohnMagnolia, proverei sia SimpleXML che il parser SAX menzionato nella risposta di Evan Carroll. La velocità è una considerazione, così come la facilità dell'interfaccia di programmazione. Quest'ultima è una questione di gusti personali, quindi dovresti provare entrambi e vedere cosa ti piace. –

+0

In risposta alla domanda di John Magnolia, XMLReader di SimpleXML è più veloce per molti piccoli file (vedi la mia risposta sotto); presumibilmente anche SAX. – Josiah

8

** Questo è orientato principalmente verso quelli che iniziano con l'analisi XML e non sono sicuro di quale parser usare.

Ci sono due "grandi" modi per fare il parsing - puoi caricare l'XML in memoria e trovare quello che ti serve (DOM, SimpleXML) o puoi eseguire lo streaming - leggerlo ed eseguire il codice in base a ciò che leggi (XMLReader, SAX).

According to Microsoft, SAX è un parser "push", che invia ogni informazione alla tua applicazione e la tua applicazione la elabora. SimpleXML è un parser "pull", che ti permette di saltare pezzi di dati e solo prendere ciò che ti serve. Secondo Microsoft, ciò può semplificare e accelerare la tua applicazione, e suppongo che le implementazioni .NET e PHP siano simili. Suppongo che la tua scelta dipenda dalle tue esigenze: se stai tagliando solo alcuni tag da un blocco più grande e puoi usare lo $xml->next('Element') per saltare pezzi significativi, potresti scoprire che XMLReader è più veloce di SAX.

Analizzando ripetutamente file "piccoli" (< 30kb, 700 linee) XML, non ci si potrebbe aspettare un'enorme differenza di tempo tra i metodi di analisi. Sono stato sorpreso di scoprire che c'era. Ho eseguito un confronto tra un piccolo feed elaborato in SimpleXML e XMLReader. Speriamo che questo possa aiutare qualcun altro a visualizzare quanto sia importante questa differenza. Per un confronto reale, questo sta analizzando la risposta a due feed di richieste di informazioni sul prodotto Amazon MWS.

Ogni Parse Time è il tempo richiesto per prendere 2 stringhe XML e restituire circa 120 variabili contenenti valori di ogni stringa. Ogni ciclo prende dati diversi, ma ognuno dei test era sugli stessi dati nello stesso ordine.

SimpleXML carica il documento in memoria.Ho usato il microtime per controllare sia il tempo per completare l'analisi (estrai i valori rilevanti), sia il tempo impiegato per creare l'elemento (quando è stato chiamato new SimpleXMLElement($xml)). Ho arrotondato questi a 4 cifre decimali.

Parse Time: 0.5866 seconds 
Parse Time: 0.3045 seconds 
Parse Time: 0.1037 seconds 
Parse Time: 0.0151 seconds 
Parse Time: 0.0282 seconds 
Parse Time: 0.0622 seconds 
Parse Time: 0.7756 seconds 
Parse Time: 0.2439 seconds 
Parse Time: 0.0806 seconds 
Parse Time: 0.0696 seconds 
Parse Time: 0.0218 seconds 
Parse Time: 0.0542 seconds 
__________________________ 
      2.3500 seconds 
      0.1958 seconds average 

Time Spent Making the Elements: 0.5232 seconds 
Time Spent Making the Elements: 0.2974 seconds 
Time Spent Making the Elements: 0.0980 seconds 
Time Spent Making the Elements: 0.0097 seconds 
Time Spent Making the Elements: 0.0231 seconds 
Time Spent Making the Elements: 0.0091 seconds 
Time Spent Making the Elements: 0.7190 seconds 
Time Spent Making the Elements: 0.2410 seconds 
Time Spent Making the Elements: 0.0765 seconds 
Time Spent Making the Elements: 0.0637 seconds 
Time Spent Making the Elements: 0.0081 seconds 
Time Spent Making the Elements: 0.0507 seconds 
______________________________________________ 
           2.1195 seconds 
           0.1766 seconds average 
over 90% of the total time is spent loading elements into the DOM. 

Only 0.2305 seconds is spent locating the elements and returning them. 

Mentre il XMLReader, che si basa flusso, sono stato in grado di saltare un pezzo significativo di uno dei feed XML in quanto i dati che volevo era vicino alla parte superiore di ogni elemento. "Il tuo chilometraggio può variare".

Parse Time: 0.1059 seconds 
Parse Time: 0.0169 seconds 
Parse Time: 0.0214 seconds 
Parse Time: 0.0665 seconds 
Parse Time: 0.0255 seconds 
Parse Time: 0.0241 seconds 
Parse Time: 0.0234 seconds 
Parse Time: 0.0225 seconds 
Parse Time: 0.0183 seconds 
Parse Time: 0.0202 seconds 
Parse Time: 0.0245 seconds 
Parse Time: 0.0205 seconds 
__________________________ 
      0.3897 seconds 
      0.0325 seconds average 

Ciò che colpisce è che anche posizionare elementi è lievemente superiore nella SimpleXML una volta che è tutto caricato, è in realtà oltre 6 volte più veloce usare XMLReader complessiva.

Potete trovare alcune informazioni su come usare XMLReader a How to use XMLReader in PHP?

Problemi correlati