2013-02-18 12 views
17

Oceniając wydajność ram PHP natknąłem się na dziwny problemWydajność text/html vs. application/json

Wysyłanie JSON jako application/json wydaje się znacznie wolniej niż wysyłanie bez dodatkowego nagłówka (który wydaje się awaryjne text/html)

Przykład # 1 (zgłoszenie/json)

header('Content-Type: application/json'); 
echo json_encode($data); 

Przykład 2 (text/html)

echo json_encode($data); 

Testy z apachebench (ab -c10 -n1000) daje mi:

Przykład 1: 350 #/s

Przykład 2: 440 #/s

co wskazuje, że ustalenie dodatkowego nagłówka wydaje być nieco wolniejszym.

Ale:

Pierwsze takie same JSONs poprzez "Ajax" (jQuery.getJSON('url', function(j){console.log(j)});) sprawia, że ​​różnica bardzo duża (timing jak widać w Chrome Web Inspector):

Przykład # 1: 340 ms/request

Przykład nr 2: 980 ms/prośba

Co się stało z tą różnicą?

Czy istnieje jakiś powód, aby używać aplikacji/json pomimo różnicy wydajności?

+1

Czy to ma znaczenie, jeśli uruchomisz 'ob_start();' przed ustawieniem nagłówka? – mkaatman

+0

trochę, ale różnica jest taka sama – stwagner

+1

Bez spojrzenia na kod źródłowy, nie sądzę, że jQuery.getJSON dba o typ zawartości, prawda? – stwagner

Odpowiedz

1

Czy Twój serwer obsługuje gzipowanie/deflację w różny sposób w zależności od typu zawartości? Mój robi. Believe ab nie akceptuje domyślnie gzip. (Możesz ustawić to w ab z niestandardowym nagłówkiem z opcją -H). Ale Chrome zawsze mówi, że akceptuje gzipowanie.

Można użyć curl test, aby sprawdzić, czy pliki mają różne rozmiary:

curl http://www.example.com/whatever --silent -H "Accept-Encoding: gzip,deflate" --write-out "size_download=%{size_download}\n" --output /dev/null 

Można również spojrzeć na nagłówki, aby zobaczyć czy gzipping nanosi:

curl http://www.example.com/whatever -I -H "Accept-Encoding: gzip,deflate" 
+0

tak to wszystko, gzipowanie nie zostało włączone dla aplikacji/json, żadna prędkość nie jest prawie równa! – stwagner

2

Wezmę w górę ostatnia część pytania:

Czy istnieje powód do stosowania aplikacji/json pomimo wydajności diffe odrodzenie?

Odpowiedź: Tak

Dlaczego: 1) text/html często mogą być zniekształcone json i pójdzie nieprzechwycony dopóki nie spróbujesz analizowania go.application/json zakończy się niepowodzeniem i będziesz mógł łatwo debugować, gdy json zostanie zniekształcony:

2) Jeśli przeglądasz json w przeglądarce, typ nagłówka sformatuje go w przyjaznym dla użytkownika formacie. text/html pokaże to bardziej jako blob.

3) Jeśli ten zużywa JSON na stronie internetowej, application/json zostaną natychmiast przekształcony js obiektu i można z nich korzystać jak obj.firstnode.childnode itp

funkcja 4) zwrotna może pracować na application/json, ale nie na text/html

Uwaga: Korzystanie gzip będzie dostatecznie złagodzić problem wydajności. text/html będzie nadal nieco szybszy, ale nie zalecany sposób pobierania obiektów json.

Chciałby jednak uzyskać więcej informacji na temat wydajności. Długość nagłówka zdecydowanie nie powoduje problemów z wydajnością. Więcej informacji na temat serwera sieciowego analizującego format nagłówka.

Powiązane problemy