Скорость JQuery AJAX против скорости прямого доступа - PullRequest
5 голосов
/ 06 марта 2012

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

Мой 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 и Fiddler с похожими результатами.При репликации одного из запросов в Fiddler я получаю результат, аналогичный тому, что происходит при переходе непосредственно к ресурсу в браузере.

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

1 Ответ

1 голос
/ 06 марта 2012

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

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

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

...