Performance text/html vs. application/json

2022-08-30 22:27:29

在评估PHP框架的性能时,我遇到了一个奇怪的问题

发送 JSON 似乎比不带额外标头的发送要慢得多(这似乎回退到application/jsontext/html)

示例 #1(应用程序/json)

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

示例 #2(文本/html)

echo json_encode($data);

使用apache bench()进行测试,我得到了:ab -c10 -n1000

示例 #1:350 #/秒

示例 #2:440 #/秒

这表明设置额外的标头似乎有点慢。

但是

通过“ajax”()获得相同的JSON会使差异变得非常大(在Chrome Web Inspector中看到的时间):jQuery.getJSON('url', function(j){console.log(j)});

示例 #1:340 毫秒/请求

示例 #2:980 毫秒/请求

这种差异是什么问题?

尽管存在性能差异,但是否有理由使用 application/json?


答案 1

我将接过问题的最后一部分:

尽管存在性能差异,但是否有理由使用 application/json?

答:是的

原因:1)text/html通常是格式错误的json,并且在您尝试解析它之前不会被捕获。application/json 将失败,只要 json 格式不正确,您就可以轻松调试

2)如果您在浏览器中查看json,则具有标头类型将以用户友好的格式设置其格式。text/html 会将其更多地显示为 blob。

3)如果您在网页上使用此json,则apprament/json将立即转换为js对象,您可以像其他方式访问它们一样访问它们。obj.firstnode.childnode

4)回调功能可以工作,但不能工作application/jsontext/html

注意:使用 gzip 将充分缓解性能问题。 仍然会更快,但不是获取json对象的推荐方式text/html

希望看到更多关于性能的见解。标头长度绝对不会导致性能问题。与分析标头格式的Web服务器有关的更多信息。


答案 2

您的服务器是否根据内容类型以不同的方式处理 gzpping/deflate?我的有。Believe ab 默认不接受 gzip。(您可以使用带有 -H 标志的自定义标头在 ab 中设置此项)。但Chrome总是会说它接受gzipping。

您可以使用卷曲测试来查看文件的大小是否不同:

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

您还可以查看标头以查看是否应用了 gzpping:

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

推荐