J'ai une très grande application javascript, qui contient principalement du code asm.js (il est construit sur le moteur urho3d c ++ qui est eux-mêmes compilés dans asm.js).
Il fonctionne très bien sur la plupart des navigateurs (Chrome, Firefox, Safari, Edge) mais est extrêmement lent sur IE11. Le fait est que cela n'est lent que lorsque vous ouvrez les outils de développement. Avec les outils de développement ouverts, IE11 devient ~ 10 fois plus rapide et presque aussi rapide que les autres navigateurs.
Voici un exemple minimal qui reproduit le problème:
http://test.sebbia.com/urho3d/test.html
Ouvrez la page dans n'importe quel navigateur de travail, le temps entre "Run - start" message et Le message "Run - finish" devrait durer environ 1 à 2 secondes.
Ouvrez la page dans IE11 sans outils de développement, le temps devrait être d'environ 35 à 50 secondes.
Ouvrez les outils de développement et rechargez, le temps devrait être d'environ 2-3 secondes.
Une autre remarque importante est que si je démarre la session de profilage dans les outils de développement, les performances chutent comme si les outils de développement étaient fermés. Je peux donc réellement profiler le problème. Mais j'ai passé plusieurs heures à profiler et j'ai essayé d'insérer des messages de journal dans de grandes fonctions mais je n'ai trouvé aucun goulot d'étranglement. Toutes les fonctions prennent à peu près le même temps à exécuter et si j'insère un message de journal au milieu d'une grande fonction, elles se divisent généralement en 2 parties similaires. Il n'y a donc pas de fonction unique responsable du ralentissement, l'exécution du code est juste lente. Décalages de bits, appels de fonctions, opérations arithmétiques - il semble qu'ils prennent tous beaucoup trop de temps par rapport aux outils de développement ouverts.
J'ai vraiment besoin de faire fonctionner mon application sur IE11 et le fait qu'elle fonctionne avec les outils de développement ouverts me rend fou. J'essaie de trouver un moyen de faire IE penser que les outils sont ouverts même quand ils ne le sont pas, ou obtenir de bonnes performances par tout autre moyen. Donc mes questions sont comment puis-je atteindre des performances égales à IE11 avec les outils de développement ouverts sans ouvrir les outils manuellement ?
Il s'agit d'une question très large, je voudrais donc la décomposer en plusieurs questions plus petites:
Existe-t-il un moyen de faire croire à IE11 que les outils de développement sont ouverts? Peut-être qu'il manque quelque chose comme une balise META compatible x-ua?
Quelle est la cause du ralentissement lorsque les outils de développement sont fermés? J'ai entendu dire que les appels de la fonction console.log sont lents sans outils de développement sur IE8 et 9, peut-être qu'il y a une chose similaire sur IE11? Peut-être que asm.js n'est pas optimisé? Si je savais ce qui cause cela, je pourrais au moins essayer de réécrire le code pour éviter cela.
Existe-t-il un moyen d'ouvrir les outils de développement à partir du code javascript? Je pourrais peut-être demander aux utilisateurs d'appuyer sur un bouton du site Web pour "rendre l'application plus rapide". Leur demander d'appuyer sur F12 ou de naviguer dans les paramètres semble trop.
Lorsque le débogueur est activé, la compilation asm.js sera désactivée et l'exécution se repliera pour être exécutée comme JS normal - vous pouvez voir le console.log
s dans ce sens au début de l'exécution.
asm.js has been disabled as the script debugger is connected. Disconnect the debugger to enable asm.js.
dans Edge,
asm.js type error: Disabled by debugger
dans Firefox,
tandis que Chrome n'ouvrira tout simplement pas 01_HelloWorld.js
dans le débogueur lorsque vous essayez de le faire.
Désactiver le débogueur dans IE (onglet débogueur, symbole de socket; huitième à partir de la gauche), et ainsi activer asm.js
vous permettra d'ouvrir les outils de développement mais de voir l'exécution plus lente. J'ai le sentiment horrible que le ralentissement lorsque le débogueur est fermé n'est en fait que des problèmes de vitesse d'IE11 avec asm.js
optimisations.
Il existe de nombreuses références à IE11 mal optimisées pour asm.js
. caniuse.com va jusqu'à lister IE11 comme ne supportant pas asm.js
du tout.
https://caniuse.com/#feat=asmjs
Cela semble être soutenu par Microsoft lui-même:
https://developer.Microsoft.com/en-us/Microsoft-Edge/platform/status/asmjs/
Il semblerait certainement qu'il y ait un certain soutien, bien qu'il présente clairement un certain nombre de problèmes de vitesse, comme le démontrent un certain nombre de repères, par exemple:
https://github.com/Kukunin/asm.js-benchmark/blob/master/README.md
Ce qui montre IE11 environ 10 fois plus lent que les autres navigateurs, ou:
https://www.ghacks.net/2014/11/03/massive-benchmark-highlights-asm-js-performance-of-web-browsers/
Qui est basé sur:
https://kripken.github.io/Massive/ - Vous pouvez l'essayer par vous-même.
Et plein d'autres. Il se peut simplement que l'implémentation IE11 de asm.js
est si pauvre qu'il est considérablement plus lent avec lui que sans lui.
EDIT: Ajout du lien d'état de la plateforme Microsoft.
Ce n'est qu'une supposition, mais j'ai eu un problème similaire dans React-Native, puis j'ai découvert cela:
Lors du débogage à distance, votre bundle js utilise le JSC de Chrome et lors de l'exécution sur un appareil, il utilise le JSC fourni par Apple sur votre téléphone.
Sois sûr que urho3d
ne change pas d'environnement lorsque les outils de développement sont activés/désactivés.