2009-06-14 11 views
14

Buduję klasy, które łączą się z interfejsem API Twittera i zastanawiam się, czy wbudowany moduł PHP lub parser JSON jest szybszy? Twitter prześle mi te same dane w obu formatach, więc wydajność PHP będzie determinować mój wybór. Używam php_apc, więc możesz pominąć analizę czasu i założyć, że uruchamiam kod bajtowy.PHP: czy parser JSON lub XML jest szybszy?

Dzięki!

więcej: Po prostu szukam tablic asocjacyjnych na podstawie danych. Nie robię spaceru drzewa, iteracji węzła ani niczego zbyt skomplikowanego. Format zawsze będzie taki sam. (Mam nadzieję!)

+7

Dlaczego nie porównywać go samodzielnie z prawdziwymi zestawami danych, których będziesz używać? Wydajność parsera może być całkowicie zależna od tego, co ją podaje. –

+1

Który z PHP xml-apis zamierzasz użyć? Domyślam się, że SimpleXML i DOM działają wolniej lub na równi z JSON, podczas gdy XMLReader lub SAX jest szybszy. –

Odpowiedz

10

nie zrobiłem żadnego odniesienia ale ...

Od JSON jest tylko opis zagnieżdżonych sekwencji smyczkowych, bez konieczności oferowania interfejsu DOM, atrybuty analizowania i inne subtelne rzeczy , przypuszczam, że parser JSON jest DOWOLNO szybszy niż parser XML.

+1

Zgadzam się.JSON ma znacznie prostszą i mniej dynamiczną strukturę. – Blixt

+4

Parsowanie formatu JSON jest znacznie bardziej skomplikowane niż dobrze zdefiniowany kod XML. Ciąg analizowania to bardzo skomplikowana praca, może dlatego, że używasz standardowej funkcji biblioteki, której nie czujesz, ale łatwiej jest parsować strukturę XML niż dane zorganizowane w JSON. –

+0

Jeśli rozważasz tylko czysty parsowanie, JSON powinien być znacznie szybszy. Ale zależy to również od użycia przeanalizowanych danych. –

1

Odpowiedź zależy od tego, w jaki sposób zamierzasz z niej skorzystać. Chodzi mi o to, że jeśli utworzysz jakieś żądanie i przetworzysz je w skrypcie PHP, wierzę, że XML będzie znacznie szybszy. Ale gdy zastanawiasz się nad wywołaniem AJAX i późniejszym procesem wyniku, powinieneś rozważyć użycie JSON, ponieważ korzystasz z JavaScript automatycznego reprezentowania wyniku JSON jako obiektu, a także obsługuje on żądania międzydomenowe z funkcjami wywołania zwrotnego, podczas gdy dla XML będziesz proxy .

0

JSON wydaje się być dużo mniejsze

także uruchomić json_decode raz, a następnie uzyskać dostęp do danych w postaci tablicy nie używać żadnych innych funkcji.

bez uruchamiania odniesienia id iść z JSON jest szybsza

17

Komentarz od Adama powyżej przekonał mnie do odniesienia nim. Korzystając z https://twitter.com/status/mentions.[format], stwierdziłem, że simplexml_load_string() jest SLIGHTLY szybszy niż json_decode(). Ale różnica jest praktycznie marginesem błędu.

Test #1 time (xml): 3.75221395493 seconds 
Test #2 time (xml): 4.1562371254 seconds 
Test #3 time (xml): 3.60420489311 seconds 
Test #4 time (xml): 3.85622000694 seconds 
Test #5 time (xml): 3.89622211456 seconds 

kontra

Test #1 time (json): 4.53225803375 seconds 
Test #2 time (json): 4.06823205948 seconds 
Test #3 time (json): 4.03222990036 seconds 
Test #4 time (json): 3.80421590805 seconds 
Test #5 time (json): 3.88022208214 seconds 

na poniższym kodzie (gdzie ja już curl'ed dane do pliku, danych. [Xml, json]).

<?php 

$test = 'json'; //xml or json 
$data = implode(file("data.".$test),"\r\n"); 

for ($t=1; $t<=5; $t++) { 
    $start[$t] = microtime(1); 
    for ($i=0; $i<3000; $i++) { 
     if ($test == 'xml') $xml = simplexml_load_string($data); 
     else $json = json_decode($data); 
    } 
    $end[$t] = microtime(1); 
    echo "<p>Test #{$t} time ({$test}): " . ($end[$t] - $start[$t]). " seconds</p>"; 
} 
+14

Test ten jednak po wczytaniu nie odczytuje danych z obiektu XML. Podczas gdy json_decode zwraca prostą tablicę, SimpleXML daje obiekt ze specjalnymi metodami odczytu danych, w tym trochę magii dynamicznej. Może to wpłynąć na wydajność. –

4

staram się znaleźć tego simplexml_load_string() jest szybsza niż json_decode(), gdy zwrot json jest obiektem.

Jednakże, jeśli json zwrócony jako tablica przy pomocy json_decode ($ string, true) jest w rzeczywistości dużo szybszy niż użycie obiektu (tak jak w większości rzeczy PHP przy porównywaniu tablic z obiektami).

Widziałem, że json_decode() jest ponad dwukrotnie szybszy niż simplexml_load_string() w tych okolicznościach.

1

Czy zastanawiałeś się, w jaki sposób ogólne zmniejszenie przepustowości może wpłynąć na wydajność twojego skryptu? Jeśli twoje prośby będą powtarzane, znaczna ilość czasu przy użyciu JSON powinna być rozsądnym wyborem ekonomicznym.