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