【发布时间】:2012-03-06 15:01:38
【问题描述】:
我有一个使用 Pyramid 框架编写的 Web 服务和一个使用 jQuery 和 jQuery Mobile 编写的前端。我注意到,与直接在浏览器中访问 URL 相比,使用 Ajax 方法完成某些 Ajax 调用的时间大约要长 5-10 倍。
为了简洁起见,我的 Ajax 代码如下所示:
$.ajax({
url:address,
dataType:'jsonp',
crossDomain: true,
success: function(data)
{
Parsing and other stuff that takes some time...
}});
现在,我一次触发大约 10 个这些,发送到不同的 URL,这可能是响应较慢的原因,但如果我一次只触发一个,它仍然慢大约 3 倍。 (30 毫秒对 90 毫秒)。我曾尝试使用 Pyramid 中的女服务员,以及 mod_wsgi(1 个进程,4 个线程),结果大致相同。
我的问题是:开销来自哪里?金字塔?网络服务器? jQuery? jQM? .ajax()?如果可以减少请求时间,我该怎么做?
编辑:在 JSON 和 JSONP 之间切换几乎没有效果,但进一步的测试表明,从测试到测试的时间变化很大(50 毫秒到 100 毫秒)。但是,通过浏览器直接访问服务总是30ms +/- 1 ms。
我已经使用 Firebug、Chrome Web 开发工具和 Fiddler 对此进行了测试,结果相似。在 Fiddler 中复制其中一个请求时,我得到的结果与在浏览器中直接访问资源的结果相似。
这是一个来自 Firebug 的屏幕截图,我故意尝试通过运行 9 个调用,每次运行 5 次来使其变慢:http://s16.postimage.org/n6t5z1ow5/ajax_Cap.png 希望可以提供更多提示。灰色是“阻塞”,紫色是“等待”。
【问题讨论】:
-
您在 Firebug 中看到了什么?您是否在任何步骤都记录了时间?数据在您身边,而不是我们...
-
在 Firebug 和 Chrome 中,我发现大部分时间都花在 ajax 和直接访问情况下“等待”。
-
这可能是与使用
jsonp相关的某种开销。这个测试表明它比正常的要慢一点json:jsperf.com/ajax-jsonp-vs-ajax-json -
另外,是否是同一个 Pyramid 进程同时为页面和 jsonp 提供服务?
-
我将通过切换到运行两者的服务器的 json 进行测试,这样可以消除跨域/jsonp 问题。 Pyramid 提供的 JS 或其他一些 Web 服务器 JS 的结果大致相同。 (如果我明白你的意思……)
标签: jquery ajax performance mod-wsgi pyramid