我有一个使用Pyramid框架编写的Web服务和使用jQuery和jQuery Mobile编写的前端。我注意到,使用Ajax方法完成一些Ajax调用需要大约5-10倍的时间才能直接访问浏览器中的URL。
我的Ajax代码看起来像这样,为简洁起见缩短了:
$.ajax({
url:address,
dataType:'jsonp',
crossDomain: true,
success: function(data)
{
Parsing and other stuff that takes some time...
}});
现在,我同时触发了大约10个不同的URL,这可能是响应速度较慢的原因,但是如果我一次只发射一个,它仍然会慢大约3倍。 (30ms vs 90ms)。我曾尝试在Pyramid中使用女服务员,以及mod_wsgi(1个进程,4个线程),结果大致相同。
我的问题是:开销来自哪里?金字塔?网络服务器? jQuery的? JQM?阿贾克斯()?如果有什么可以减少请求时间,我该怎么办?
编辑:在JSON和JSONP之间切换影响不大,但进一步测试表明,从测试到测试的时间变化很大(50ms到100ms)。但是,通过浏览器直接访问服务总是30ms +/- 1 ms。
我使用Firebug,Chrome Web Dev工具和Fiddler对此进行了测试,结果相似。在Fiddler中复制其中一个请求时,我得到的结果与在浏览器中直接访问资源的结果类似。
这是一个来自Firebug运行的屏幕截图,我有意通过每次运行5次调用来使速度变慢:http://s16.postimage.org/n6t5z1ow5/ajax_Cap.png希望能提供更多提示。灰色是“阻挡”,紫色是“等待”。
答案 0 :(得分:1)
我猜这个问题是crossdomain / jsonp选项 - 因为这是一个'假的'ajax请求来绕过浏览器安全限制。
JQuery在这里做的是创建一个脚本元素,其源设置为您在调用中提供的URL(以及其他一些东西,将返回的数据包装在函数调用中),所以几乎可以肯定有一些奇怪/缓慢继续如果我没记错的话,浏览器实际上会阻止脚本执行,同时它也会加载脚本块......?
您可以尝试通过在服务中添加"Access-Control-Allow-Origin"标题设置为'*'(允许所有访问权限)并取出所有“跨域”内容来解决此问题。