2012-03-06 2 views
5

У меня есть веб-сервис, написанный с использованием инфраструктуры Pyramid и интерфейс, написанный с использованием jQuery и jQuery Mobile. Я заметил, что некоторые вызовы Ajax занимают в 5-10 раз больше времени, чтобы завершить использование метода Ajax, непосредственно перейдя к URL-адресу в браузере.jQuery скорость ajax против скорости прямого доступа

Мой 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 мс) от теста до испытания. Однако прямой доступ к службе через браузер всегда составляет 30 мс +/- 1 мс.

Я тестировал это с помощью Firebug, Chrome Web Dev tool и Fiddler с аналогичными результатами. При повторном копировании одного из запросов в Fiddler, я получаю аналогичный результат для перехода непосредственно к ресурсу в браузере.

Вот скринкап из Firebug run, где я целенаправленно пытаюсь сделать это медленнее, запустив 9 вызовов по 5 раз каждый: http://s16.postimage.org/n6t5z1ow5/ajax_Cap.png Надеюсь, что это может дать еще несколько советов. Серый «блокирует», фиолетовый «ждет».

+0

Что вы видите в Firebug? Вы забыли пароль на любом этапе? Данные на вашей стороне, а не наши ... – gdoron

+0

В Firebug и Chrome я вижу, что большую часть времени тратится «Ожидание» в случаях ajax и прямого доступа. – Lars

+0

Это может быть своего рода накладные расходы, связанные с использованием 'jsonp'. Этот тест показывает, что он немного медленнее обычного 'json': http://jsperf.com/ajax-jsonp-vs-ajax-json –

ответ

1

Я предполагаю, что проблема заключается в опции crossdomain/jsonp - так как это «поддельный» ajax-запрос, чтобы обойти ограничения безопасности браузера.

Что здесь делает JQuery - это создать элемент сценария с исходным кодом, указанным в URL-адресе, указанном в вызове (и некоторые другие вещи, обертывающие возвращенные данные в вызове функции), поэтому почти наверняка есть некоторые странности/медленность продолжается. Если я правильно помню, браузер фактически блокирует выполнение скрипта, в то время как он также загружает блоки скриптов ...?

Вы можете попытаться обойти это, включив в свою службу заголовок "Access-Control-Allow-Origin", установленный в '*' (разрешает весь доступ) и вынимает все ваши вещи «crossdomain».

+0

Я попытался установить «Access-Control-Allow-Origin» на «*», но это мало повлияло, насколько я могу судить. Одно большое различие между dataType: «jsonp» и dataType: «json» заключается в том, что при запуске очень большого количества запросов предыдущие запросы не блокируют следующие запросы, как показано на изображении, но результат тот же, более поздний запросы начинаются позже. – Lars

+0

после того, как вы установили заголовок и проверили, что он проходит, установите crossdomain в false и повторите попытку. – dmp

+0

Просто проверено, и это действительно происходит. Однако не существует заметной разницы. Я также попытался изменить рендеринг с jsonp на json в представлениях Pyramid, но без заметных изменений. – Lars

Смежные вопросы