Текст исполнения /html против приложения/json
При оценке производительности фреймворков PHP я столкнулся с странной проблемой
Отправка JSON как application/json
кажется намного медленнее, чем отправка без дополнительного заголовка (который, кажется, отбрасывается на text/html
)
Пример # 1 (application/json)
header('Content-Type: application/json');
echo json_encode($data);
Пример # 2 (текст/html)
echo json_encode($data);
Тестирование с помощью сканера apache (ab -c10 -n1000
) дает мне:
Пример №1: 350 #/сек
Пример # 2: 440 #/сек
который показывает, что установка дополнительного заголовка кажется немного медленнее.
Но
Получение одинаковых JSON с помощью "ajax" (jQuery.getJSON('url', function(j){console.log(j)});
) делает разницу очень большой (время, указанное в Chrome Web Inspector):
Пример # 1: 340 мс/запрос
Пример # 2: 980 мс/запрос
В чем дело этой разницы?
Есть ли причина использовать приложение /json, несмотря на разницу в производительности?
Ответы
Ответ 1
Поддерживает ли ваш сервер gzipping/deflate по-разному в зависимости от типа контента? Моя делает. Поверьте, ab не принимает gzip по умолчанию. (Вы можете установить это в ab с пользовательским заголовком с флагом -H). Но Chrome всегда будет говорить, что он принимает gzipping.
Вы можете использовать curl test, чтобы узнать, имеют ли файлы разные размеры:
curl http://www.example.com/whatever --silent -H "Accept-Encoding: gzip,deflate" --write-out "size_download=%{size_download}\n" --output /dev/null
Вы также можете посмотреть заголовки, чтобы увидеть, применяется ли gzipping:
curl http://www.example.com/whatever -I -H "Accept-Encoding: gzip,deflate"
Ответ 2
Я займу последнюю часть вопроса:
Есть ли причина использовать приложение /json, несмотря на производительность разница?
Ответ: Да
Почему:
1) text/html часто может быть искажен json и будет идти не до тех пор, пока вы не попытаетесь разобрать его. application/json не удастся, и вы можете легко отлаживать всякий раз, когда json неверен.
2) Если вы просматриваете json в браузере, тип заголовка будет форматировать его в удобном для пользователя формате. text/html покажет его больше как blob.
3) Если вы используете этот json на своей веб-странице, приложение /json немедленно преобразуется в объект js, и вы можете получить к ним доступ как obj.firstnode.childnode
и т.д.
4) функция обратного вызова может работать на application/json
, но не на text/html
Примечание:
Использование gzip достаточно облегчит проблему производительности. text/html
по-прежнему будет бит быстрее, но не рекомендуемый способ для извлечения объектов json
Хотелось бы увидеть больше информации о производительности. Длина заголовка определенно не вызывает проблемы с производительностью. Больше, чем ваш веб-сервер, анализирующий формат заголовка.