IE11 XMLHttpRequest очень медленно работает

У меня есть угловой веб-сайт SPA, который очень хорошо работает в Chrome, Firefox и Edge, но сильно отстает в IE11.

Я знаю о проблемах угловых материалов с анимацией и стилями в IE11 и внес несколько изменений для улучшения общей производительности в этой области (отключение анимации, даже удаление тем и т. д.).

Но, даже если это немного улучшит приложение, я все равно могу увидеть огромное отставание при загрузке ресурсов, когда каждый запрос тратит много времени (очень много времени) на обработку. Я проверил сервер, и ответ всегда находится в диапазоне миллисекунд (как в Chrome), но в IE11 это занимает вечность.

Пожалуйста, проверьте время загрузки сети для IE11.

введите описание изображения здесь

против Хрома.

введите описание изображения здесь

Любые идеи о том, что может быть причиной этого?

Ваше здоровье,


person pedromarce    schedule 18.10.2016    source источник
comment
@Mistalis Браузерные войны IE и Netscape - вот почему у нас есть много вещей, это не самое худшее .... Если вы не были рядом с document.all и document.layers, вы пропустили настоящее удовольствие.   -  person epascarello    schedule 18.10.2016
comment
Что означает желтый цвет в ваших инструментах разработки IE? Если это TTFB, делает ли ваш сервер что-то по-другому для запросов, поступающих из IE?   -  person noppa    schedule 18.10.2016
comment
Нет, он делает то же самое, но я думаю, что сузил проблему до вычисления стиля, содержащего поток сети (что на самом деле имеет смысл), но вкладка сети довольно запутана.   -  person pedromarce    schedule 18.10.2016
comment
@pedromarce У меня похожая проблема. Можете ли вы рассказать немного больше о том, что вы обнаружили? Удалось ли вам найти удовлетворительное решение?   -  person paul    schedule 16.11.2016
comment
@paul Если вы используете угловой материал, проверьте github.com/angular/material/issues/8329, в итоге для меня были в основном стили, я удалил много ненужных файлов CSS и в итоге он стал достаточно отзывчивым (не быстрым, но работоспособным)   -  person pedromarce    schedule 16.11.2016
comment
@pedromarce Нет, я использую jQuery. Но этого было достаточно, чтобы отделить манипуляции с DOM от функции ajax:success (используя setTimeout). Затем я попытался уменьшить доступ к DOM при построении результата. Кажется, что-то улучшилось.   -  person paul    schedule 16.11.2016
comment
@pedromarce Эти скриншоты на вкладке «Сеть» не кажутся эквивалентными для сравнения. Я предлагаю вам изолировать один вызов XHR и проводить с ним тестирование, постепенно добавляя параллельные асинхронные запросы после загрузки всех остальных ресурсов, поскольку вы подозреваете только XHR.   -  person bhantol    schedule 23.01.2018
comment
Какой у вас бэкенд, используете ли вы какой-то бэкэнд IIS? IE может пытаться выполнять какие-то дополнительные действия, специфичные для браузера, которые могут выполнять только серверные части Windows.   -  person Kyle B    schedule 26.03.2018


Ответы (8)


Я бы подключил к браузеру отладчик НАСТОЯЩЕЙ ОС и попытался определить, действительно ли IE запускает поток для выполнения XHR. Это сложное расследование, но оно многое объясняет.

Большинство браузеров делают это, а затем направляют обратные вызовы и данные обратно в MAIN UI THREAD. Но IE СТАРЫЙ, и я не знаю, что он делает.

На другую мысль. Наша БОЛЬШАЯ компания, которая движется медленно, наконец, отказалась от поддержки IE, что позволило нам писать приличный код с обещаниями без полифилла. Наша кодовая база медленно очищает другие странные полифиллы, которые мы приобрели с течением времени. Долгое время мы НЕ могли писать для (клавиша var), потому что в списке появлялся полифилл.

Вы могли бы подумать об этом обсуждении с клиентами. Он начинается с «Как насчет Edge или Firefox». Вы можете поговорить о замене других вещей. Вы обновляете свой телефон и ноутбук... как насчет браузера...

Прежде всего удачи.

person cbuteau    schedule 27.08.2020
comment
+1. Я бы добавил, что старые, неподдерживаемые браузеры, такие как IE11, не получают обновлений, чтобы использовать новые функции безопасности, реализованные на сервере (например, заголовок content-security-protocol). Продолжая поддерживать IE11, мы позволяем нашим клиентам работать в Интернете небезопасным образом, и вероятность того, что они (и, возможно, наши компании) понесут финансовые потери, высока. - person Andy Merts; 23.04.2021

Вы можете выяснить, перехватывается ли запрос XMLHttpRequest. В то время как современные браузеры снижают производительность при этом меньше, для IE обмен собственными вызовами с функциями JS влияет в определенной степени и масштабируется по мере его использования. Это относится к множеству полифиллов и расширенному функционалу.

person lotype    schedule 22.07.2020

Судя по вашим снимкам экрана, может быть узкое место вокруг предварительных запросов CORS... Возможно, это https://developer.akamai.com/blog/2015/08/17/performance-single-page-apps объяснит вам жизнеспособный обходной путь .

Кроме того, я хотел бы выяснить, почему ваше приложение делает множество запросов OPTION, если только это не предусмотрено, ваше приложение совершает много круговых поездок, каждое из которых задерживает следующее, и с ограничением на одновременные соединения вы в конечном итоге потребляете пул и блокируете дальнейшие просьбы...

Было бы интересно посмотреть, что происходит по сети, через вкладку сети IE...

person rexfordkelly    schedule 26.07.2020

Похоже, что XMLHttpRequest ставится в очередь, а затем выполняется в пакетном режиме, по существу останавливая каждый запрос, пока какой-то внутренний процесс не отправит их все сразу.

Первое, что я хотел бы исследовать, это то, что IE имеет (плохо задокументированные) внутренние ограничения на количество одновременных запросов XMLHttpRequest и браузера, которые он разрешает одновременно. В более старых версиях это было 2, но оно увеличилось примерно в IE8 до 6 в зависимости от какой-то ужасной и ненадежной внутренней метрики относительно того, насколько быстрой, по мнению IE, является ваша сеть. IE11 по-прежнему делает это, но имеет более высокий предел.

Я предполагаю, что вы достигли этого предела, и как только вы его достигли, проверка внутреннего таймера, которая управляет пакетами в IE, занимает 1-2 секунды, прежде чем он отправит другой набор на сервер.

Чтобы проверить эту гипотезу: в IE11 добавьте только ожидание 100 мс (его просто должно быть достаточно, чтобы ограничить количество параллельных запросов) перед отправкой каждого запроса. Это по-прежнему будет ужасно медленным, но если причиной является внутренняя пакетная обработка, вы не увидите 1-2-секундную задержку в блоках запросов.

Если это проблема, исправление может быть своего рода группировкой, чтобы попытаться избежать ограничения IE, но, поскольку это динамично, я подозреваю, что это будет непропорционально много боли для ‹ 1,5% пользователей.

person Keith    schedule 30.07.2020

5-6 мс в Chrome кажутся слишком коротким временем для фактического вызова сервера. Если мы смотрим на одни и те же сетевые вызовы на обоих скриншотах (неясно, так ли это), то более вероятно, что Chrome использует кэшированный ответ, а IE совершает сетевой вызов. Проверьте заголовки кэширования и убедитесь, что вы используете те, которые понимает IE.

person redab    schedule 14.10.2020

Эта проблема связана с конфигурацией браузера Internet Explorer для запросов AJAX.

Выполните следующие локальные изменения:

Внесите изменения в локальную политику, как показано ниже:

Перейдите в Компоненты Windows › Internet Explorer › Функции безопасности › AJAX Включите «Разрешить встроенную поддержку XMLHTTP». Измените «Максимальное количество подключений на хост (HTTP1.1)» на 16. Измените «Максимальное количество подключений на сервер (HTTP1.0)» на 16.

Кроме того, большинство компаний отказываются от поддержки IE. Никто не хочет писать полифиллы для вещей, которыми никто не пользуется, и почему вы используете IE? Пожалуйста, ответьте, я хочу знать.

person Swapnil Sharma    schedule 03.12.2020

Вы можете копнуть глубже, чтобы отследить сеть http, используя журналы Microsoft ETL.

  • Создайте папку C:\msfiles

  • открыть cmd с повышенными правами администратора

  • введите команду netsh trace start InternetClient_dbg capture = yes maxsize = 450 filemode = круговой постоянный = yes overwrite = yes traceFile = C:\msfiles\Etl_trace.etl

  • выполните действие, которое вы хотите, это фактическая проблема с сетью

  • остановить трассировку с помощью команды netsh trace stop

-› теперь у вас есть Etl_trace.etl

Сделайте это один раз с IE и один раз с Chrome и сравните журналы...

person Ziv Adler    schedule 03.12.2020

У меня была похожая проблема с AngularJS в IE, мы отследили нашу проблему до обновления безопасности для IE (KB2962872). Удаление этого патча вернуло производительность к норме.

person Blackfish    schedule 28.08.2018
comment
Можете ли вы вдаваться в некоторые подробности? Потому что обычно веб-сайты не могут позволить себе удалить обновления безопасности на чужих компьютерах. (т. е. что в этом обновлении, по вашему мнению, отвечает, и как вы подтвердили, что это именно то обновление, помимо простого удаления, и теперь все идет быстрее, что не помогает понять основную проблему) - person Mike 'Pomax' Kamermans; 26.07.2020