性能文本/ html与application/json

stw*_*ner 17 php ajax jquery json

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

发送JSON application/json似乎比没有额外标头的发送要慢得多(这似乎是回退text/html)

示例#1(application/json)

header('Content-Type: application/json');
echo json_encode($data);
Run Code Online (Sandbox Code Playgroud)

示例#2(text/html)

echo json_encode($data);
Run Code Online (Sandbox Code Playgroud)

用apache bench(ab -c10 -n1000)测试给了我:

示例#1:350#/ sec

示例#2:440#/ sec

这表明设置额外的标题似乎有点慢.

但是:

通过"ajax"(jQuery.getJSON('url', function(j){console.log(j)});)获取相同的JSON 会使差异非常大(Chrome Web Inspector中显示的时间):

示例#1:340 ms /请求

示例#2:980 ms /请求

这个差异的问题是什么?

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

Vis*_*rma 5

我将讨论问题的最后一部分:

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

答案:是的

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

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

3) 如果您在网页上使用此 json,application/json 将立即转换为 js 对象,您可以通过obj.firstnode.childnode等方式访问它们。

4) 回调功能可以在 上工作application/json,但不能在text/html

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

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


All*_*One 3

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

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

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

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

curl http://www.example.com/whatever -I -H "Accept-Encoding: gzip,deflate" 
Run Code Online (Sandbox Code Playgroud)