我有一个使用 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...
}});
现在,我一次向不同的 URL 触发大约 10 个,这可能是响应速度较慢的原因,但如果我一次只触发一个,速度仍然慢 3 倍左右。 (30 毫秒与 90 毫秒)。我尝试过使用 Pyramid 中的 waitress 以及 mod_wsgi(1 个进程,4 个线程),结果大致相同。
我的问题是:开销从哪里来? Pyramid ?网络服务器? 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希望能给一些更多的提示。灰色为“阻塞”,紫色为“等待”。
请您参考如下方法:
我猜测问题出在 crossdomain/jsonp 选项上 - 因为这是一个“假”ajax 请求,旨在绕过浏览器安全限制。
JQuery 在这里所做的是创建一个脚本元素,并将源设置为您在调用中提供的 URL(以及其他一些东西,将返回的数据包装在函数调用中),因此几乎可以肯定存在一些奇怪/缓慢的情况正在进行中。如果我没记错的话,浏览器在加载脚本 block 时实际上也会阻止脚本执行...?
您可以尝试通过在您的服务中包含 "Access-Control-Allow-Origin" 来解决此问题 header 设置为“*”(允许所有访问),并取出所有“跨域”内容。
