18

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

发送 JSONapplication/json似乎比没有额外标头的发送要慢得多(这似乎回退到text/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” jQuery.getJSON('url', function(j){console.log(j)});

示例 #1:340 毫秒/请求

示例 #2:980 毫秒/请求

这个区别是怎么回事?

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

4

2 回答 2

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 对象的推荐方式

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

于 2013-02-26T09:51:14.893 回答
3

您的服务器是否根据内容类型以不同方式处理 gzipping/deflate?我的可以。Believe ab 默认不接受 gzip。(您可以使用带有 -H 标志的自定义标头在 ab 中设置它)。但是 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

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

curl http://www.example.com/whatever -I -H "Accept-Encoding: gzip,deflate" 
于 2013-02-22T19:33:46.960 回答