Qual è il più veloce parser XML in PHP?

per un certo progetto, ho bisogno di qualche modo per analizzare XML e di ottenere i dati da esso. Quindi mi chiedo, che uno dei built-in parser è il più veloce?

Inoltre, sarebbe bello del parser potrebbe accettare una stringa XML come input – io ho la mia implementazione di thread-safe lavorare con i file e non voglio che uno brutto non thread-safe, librerie per rendere i miei sforzi inutili.

  • È thread-safety davvero un problema? Il 99% delle applicazioni in PHP sono single-threaded.
  • Sono abbastanza sicuro che sta parlando di condizioni di gara basato su un’altra questione, della sua.
  • Temo di sì. Immagino che ti uso SimpleXML. Nessuna idea circa le sue prestazioni, però.

 

4 Replies
  1. 9

    Il più veloce parser sarà SAX — non è necessario creare un dom, e può essere fatto con parziale xml, o progressivamente. Info sul PHP parser SAX (Expat) può essere trovato qui. In alternativa c’è un libxml base parser DOM denominato SimpleXML. DOM base parser sarà più facile lavorare con, ma è in genere un paio di ordini di grandezza più lento.

    • Concordato. Prestazioni imbattibili, in modalità streaming, molto basso consumo di memoria. Per i mangimi o ripetitivi XMLs la scelta migliore. Guarda l’esempio in php.net/manual/en/function.xml-parse.php. Testato su 10MB XML, analizzare durata circa 3 secondi su I7 notebook tra cui negozio di MySQL flat tabella con indice full-text, il picco di heap usato circa 600kB (!)
    • Se solo… Molti dei nostri clienti aziendali sono solo il passaggio da CSV, XML e pensare JSON è un ragazzo dai conti.
  2. 8

    **Questa è orientata principalmente verso quelle che iniziano con il Parsing di XML e non sono sicuro che il parser per l’uso.

    Ci sono due “big” modi per andare su di analisi – è possibile caricare il file XML in memoria e trovare di che cosa avete bisogno (DOM, SimpleXML) o è possibile lo streaming – leggere ed eseguire il codice in base a ciò che leggi (XMLReader, SAX).

    Secondo Microsoft, SAX è un “push” parser, che invia ogni pezzo di informazioni per l’applicazione e l’applicazione di processi di esso. SimpleXML è una “tirata” parser, che consente di saltare blocchi di dati e solo afferrare ciò di cui avete bisogno. Secondo Microsoft, questo può semplificare e accelerare la vostra applicazione, e vorrei assumere il .NET e PHP implementazioni sono simili. Suppongo che la vostra scelta dipenderà dalle vostre esigenze, se si sta tirando fuori solo un paio di tag da un grande blocco e si può utilizzare il $xml->next('Element') per saltare significativi pezzi, si potrebbe scoprire che XMLReader è più veloce di SAX.

    Analisi “piccolo” (<30kb, 700 linee) file XML ripetutamente, potrebbe non aspettiamo che ci sarebbe un enorme differenza di tempo tra i metodi di analisi. Sono stato sorpreso di scoprire che non c’era. Ho fatto un confronto di un piccolo mangimi trasformati in SimpleXML e XMLReader. Speriamo che questo vi aiuterà qualcun altro per visualizzare come significativa una differenza di questo dato. Per una vita reale confronto, questa è l’analisi della risposta a due Amazon MWS richiesta di Informazioni sui Prodotti feed.

    Ogni fase di Analisi è il tempo richiesto per prendere 2 stringhe XML e ritorno di circa 120 variabili che contengono i valori di ogni stringa. Ogni ciclo dura di dati differenti, ma ognuna delle prove è stato sugli stessi dati nello stesso ordine.

    SimpleXML carichi il documento in memoria. Ho usato microtime per controllare il tempo per completare l’analisi (estratto i valori rilevanti), così come il tempo speso per la creazione di un elemento (quando new SimpleXMLElement($xml) è stato chiamato). 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 la classe XMLReader, che è basata su flusso, sono stato in grado di saltare un significativo pezzo di uno dei feed XML, poiché i dati che volevo era vicino alla parte superiore di ogni elemento. “Il Vostro 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, sebbene la localizzazione di elementi è leggermente più veloce in SimpleXML, una volta caricato, è in realtà più di 6 volte più veloce di utilizzare XMLReader generale.

    Puoi trovare alcune informazioni sull’utilizzo di XMLReader a Utilizzo di XMLReader in PHP?

  3. 3

    Ogni estensione XML ha i propri punti di forza e di debolezza. Per esempio, ho uno script che analizza i dati XML dump da un Overflow dello Stack. Il posts.xml file è di 2,8 GB! Per questo file XML di grandi dimensioni, ho dovuto usare XMLReader perché legge l’XML in modalità streaming, invece di cercare di carico e rappresentano l’intero documento XML in memoria in una sola volta, come il DOM estensione fa.

    Quindi è necessario essere più precisi circa la descrizione di come si desidera utilizzare il formato XML, al fine di decidere quale estensione PHP per l’uso.

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

    • Cosa consiglieresti come il più veloce per il caricamento di tanti piccoli file xml?
    • Vorrei provare sia SimpleXML e il parser SAX menzionato nel Evan Carroll risposta. La velocità è una considerazione, come pure la facilità dell’interfaccia di programmazione. Quest’ultima è una questione di gusto personale, così si dovrebbe provare entrambi e vedere che cosa ti piace.
    • In risposta a Giovanni Magnolia domanda, XMLReader di SimpleXML è più veloce di molti file di piccole dimensioni (vedi la mia risposta qui sotto); presumibilmente SAX sarebbe così.
  4. -3

    Non ci sono in realtà molto parser in PHP.

    Più efficaci saranno quelli forniti con PHP, scrivere un benchmark con DOM e SimpleXML e di controllo che funziona meglio.

    • “Non solo punto di riferimento, benchmark e pubblicare i dati di test, metodi di prova e risultati!

Lascia un commento