Медленное выполнение javascript в IE11 до тех пор, пока инструменты разработчика не будут включены
У меня очень большое приложение javascript, которое содержит в основном код asm.js(он построен на urho3d С++ engine, который их компилируется в asm.js).
Он отлично работает на большинстве браузеров (хром, firefox, сафари, край), но очень медленный на IE11. Дело в том, что это только медленно, пока вы не откроете инструменты для разработчиков. С открытыми инструментами разработчика IE11 становится ~ 10 раз быстрее и почти так же быстро, как и другие браузеры.
Вот минимальный пример, который воспроизводит проблему:
http://test.sebbia.com/urho3d/test.html
Откройте страницу в любом рабочем браузере, время между сообщением "Запуск - запуск" и сообщение "Запуск - завершение" должно быть около 1-2 секунд.
Откройте страницу в IE11 без инструментов разработчика, время должно быть около 35-50 секунд.
Откройте инструменты разработчика и перезагрузите, время должно быть около 2-3 секунд.
Еще одно важное замечание: если я начинаю сеанс профилирования в инструментах разработчика, производительность падает, как если бы инструменты разработчика были закрыты. Таким образом, я могу фактически профилировать проблему. Но я провел несколько часов профилирования, и я пробовал вставлять сообщения журнала в большие функции, но я не нашел узкого места. Все функции выполняются примерно в одно и то же время, и если я вставляю сообщение журнала в середине больших функций, они обычно разбиваются на 2 похожие части. Таким образом, нет единой функции, которая отвечает за замедление, выполнение кода происходит просто медленно. Бит сдвиги, вызовы функций, арифметические операции - кажется, что все они просто занимают слишком много времени по сравнению с открытыми инструментами разработчика.
Мне действительно нужно, чтобы мое приложение работало над IE11, и тот факт, что он работает с инструментами разработчика, открывает мне с ума. Я пытаюсь найти способ заставить IE подумать, что инструменты открыты, даже если они отсутствуют, или добиться хорошей производительности любыми другими способами. Итак, мои вопросы: , как я могу достичь производительности, равной IE11, с инструментами разработчика, открытыми без ручного открытия инструментов?
Это очень широкий вопрос, поэтому я хотел бы разбить его на несколько более мелких вопросов:
-
Есть ли способ заставить IE11 думать, что инструменты разработчика открыты? Может быть, есть что-то вроде x-ua-совместимого метатега, которого я не вижу?
-
Что вызывает замедление при закрытии инструментов разработчика? Я слышал, что вызовы функций console.log медленны без инструментов разработчика в IE8 и 9, может быть, есть что-то подобное в IE11? Может быть, asm.js не оптимизирован? Если бы я знал, что это значит, я мог бы хотя бы попытаться переписать код, чтобы избежать этого.
-
Есть ли способ открыть инструменты разработчика из javascript-кода? Возможно, я могу попросить пользователей нажать кнопку на веб-сайте, чтобы "сделать приложение быстрее". Попросить их нажать F12 или изменить параметры навигации слишком много.
Ответы
Ответ 1
Когда включен отладчик, компиляция asm.js будет отключена, и выполнение будет отменено для выполнения как обычный JS - вы можете увидеть console.log
вдоль этих строк в начале выполнения.
asm.js has been disabled as the script debugger is connected. Disconnect the debugger to enable asm.js.
в Edge,
asm.js type error: Disabled by debugger
в Firefox,
в то время как Chrome будет просто не открывать 01_HelloWorld.js
в отладчике при попытке.
Отключение отладчика в IE (вкладка отладчика, символ сокета, восьмой слева), и, таким образом, включение asm.js
позволит вам открыть инструменты разработчика, но увидеть более медленное выполнение. У меня ужасное ощущение, что замедление, когда отладчик закрыт, на самом деле является только проблемой скорости IE11 с оптимизацией asm.js
.
Существует много ссылок на IE11, которые плохо оптимизированы для asm.js
. caniuse.com доходит до листинга IE11 как не поддерживающего asm.js
вообще.
https://caniuse.com/#feat=asmjs
Это, как представляется, подкреплено самими Microsoft:
https://developer.microsoft.com/en-us/microsoft-edge/platform/status/asmjs/
Разумеется, определенная поддержка для него, хотя очевидно, имеет ряд проблем со скоростью, как показано в ряде эталонных тестов, например:
https://github.com/Kukunin/asm.js-benchmark/blob/master/README.md
Что показывает IE11 примерно в 10 раз медленнее, чем другие браузеры, или:
https://www.ghacks.net/2014/11/03/massive-benchmark-highlights-asm-js-performance-of-web-browsers/
На основе:
https://kripken.github.io/Massive/ - Вы можете попробовать это для себя.
И многие другие. Просто может быть, что реализация IE11 asm.js
настолько бедна, что она значительно медленнее с ней, чем без нее.
EDIT: добавлена ссылка статуса платформы Microsoft.
Ответ 2
Это всего лишь предположение, но у меня была аналогичная проблема в реакции-родной, тогда я узнал об этом:
При отладке удаленно ваш пакет js использует хром АО и когда работая на устройстве, использующем АО, предоставленное Apple на вашем телефоне.
Убедитесь, что urho3d
не меняет среду, когда инструменты разработчика включены/отключены.