URL: https://linuxfr.org/news/firefox-9-est-sorti--2 Title: Firefox 9 est sorti Authors: claudex Nÿco, Enjolras, antistress, barmic, Manuel Menal, gregR ☯, Florent Zara, tuiu pol, Laurent Pointecouteau, patrick_g, Internaciulo et O MANN Date: 2011年11月20日T15:49:11+01:00 License: CC By-SA Tags: firefox et sortie_version Score: 38 La nouvelle version du navigateur de la fondation Mozilla est sortie le 20 décembre. À part les corrections de bugs et l'amélioration de la prise en charge des standards HTML5, MathML et CSS, la principale nouveauté est [l'inférence de type](http://blog.mozilla.com/futurereleases/2011/11/10/type-inference-to-firefox-beta/) en JavaScript, qui permet une amélioration des performances. ![Firefox](http://mozcom-cdn.mozilla.net/img/covehead/firefox/brand-toolkit/download/logo-wordmark-mozilla-preview.png) Merci à [antistress](http://linuxfr.org/users/antistress), [Nÿco](http://linuxfr.org/users/nyco), [Barret Michel](http://linuxfr.org/users/barmic), [Internaciulo](http://linuxfr.org/users/internaciulo), [Enjolras](http://linuxfr.org/users/enjolras), [gregR ☯](http://linuxfr.org/users/gregr), [Hell Pé](http://linuxfr.org/users/hellpe), [o-mann](http://linuxfr.org/users/o-mann) et [Florent Zara](http://linuxfr.org/users/floxy) pour leur aide lors de la rédaction de la dépêche. Merci à [ikux](http://linuxfr.org/users/ikux) pour avoir proposé une dépêche similaire. _**Mise à jour :** Sortie de Mozilla Firefox 9.0.1 ce 21 décembre. Évidemment cette sous-version est sortie pour corriger [un grand nombre de bugs](http://www.mozilla.org/en-US/firefox/9.0.1/releasenotes/buglist.html). On notera toutefois l'ajout de [l'inférence de type](http://fr.wikipedia.org/wiki/Inf%C3%A9rence_de_types) devant améliorer la rapidité de javascript ainsi qu'une amélioration du support des standards CSS, HTML5 et MathML et de l'intégration du thème de Mac OSx Lion._ ---- [Télécharger Firefox](http://www.firefox.com) [Mozilla JavaScript 2011 (inférence de type, IonMonkey...) sur le blogue de David Mandelin](http://blog.mozilla.com/dmandelin/2011/04/22/mozilla-javascript-2011/) [Release notes](http://www.mozilla.org/en-US/firefox/9.0/releasenotes/) [Firefox for developers](https://developer.mozilla.org/en/Firefox_9_for_developers) ---- ## Optimisation du moteur JavaScript ### Compilation à la volée (JIT) Pour exécuter du code JavaScript, le moteur [[SpiderMonkey]] de Firefox compile le code en bytecode, puis l'interprète. Cette méthode peut s'avérer particulièrement lente, notamment si le code est exécuté de multiples fois, comme dans le cas de boucles. C'est pourquoi des compilateurs à la volée ont été introduits. La [[compilation à la volée]] consiste à compiler directement certaines parties du code en code natif plus efficace, et ce durant l'exécution. Le moteur JavaScript de Firefox a intégré successivement deux compilateurs à la volée : TraceMonkey (depuis la version 3.5 de Firefox) et JägerMonkey (depuis la version 4). Ces deux compilateurs sont conçus pour agir alternativement : - **TraceMonkey** va repérer les calculs complexes et répétés et enregistrer le résultat pour réutilisation ultérieure, d'où un gain de temps maximum dans les cas où il peut être utilisé. - Dans les autres cas, c'est **JägerMonkey**, un compilateur à la volée basique et efficace, qui sera utilisé. L'inférence de types est une optimisation importante de JägerMonkey. ### Inférence de types [[JavaScript]] est un langage typé dynamiquement, c'est-à-dire qu'un type n'est pas associé à chaque identificateur. Lors de la compilation, le compilateur ne connait pas le type des variables ou des expressions. La contrepartie de la grande flexibilité offerte au programmeur se traduit souvent par une perte de performance. En effet, l'information de type doit être stockée en mémoire avec l'objet lui-même, et diverses opérations doivent être déportées de la compilation à l'exécution. Prenons un exemple concret : ```javascript foo = foo + bar; ``` L'opérateur **+** est polymorphe, et cette expression peut traduire une concaténation de chaines ou une addition d'entiers. Sans information de type, un compilateur doit envisager tous les cas. Il faut donc conserver une information de type pour les deux variables dans le code produit, et compiler un jeu d'instructions, qui, suivant les types dynamiques, choisira lors de l'exécution quelle opération effectuer. Imaginons que dans notre cas, ce code est et sera uniquement une addition d'entiers : on a introduit une complexité inutile et à la compilation, et à l'exécution. L'idée de l'inférence de types et de déduire le type possible des différentes valeurs et variables en analysant le programme, et en appliquant des règles d'inférence. On garde un environnement de typage dans le contexte courant. La règle d'inférence qui s'applique dans notre exemple se traduit par : _foo a le type t dans le contexte courant si foo et bar ont le type t dans ce contexte_. Si on a plus haut: ```javascript foo = 1; ``` On peut en déduire que _foo a le type int dans le contexte courant_ et compiler le code efficacement. Bien sûr, cet exemple est relativement simpliste, et la souplesse du JavaScript ainsi que sont paradigme objet basé sur les prototypes rendent le problème bien plus complexe. Pour des informations détaillées sur les choix techniques, se reporter à [l'article des développeurs](http://people.mozilla.org/~lmesa/ti-draft.pdf). L'introduction de l'inférence de types améliore significativement les performances. Des gains de 30% ont été constatés sur divers tests. Cela devrait améliorer la réactivité de Firefox sur les sites utilisant beaucoup de code JavaScript. Sur ma machine, j'obtiens : **Navigateur** | Kraken | V8 Benchmark Suite ----------------|-------------------|------------------- **Firefox 8** | 4244.6ms +/- 1.5% | 4806 **Firefox 9b4** | 3371.5ms +/- 4.1% | 5002 **Chromium 15** | 3010.7ms +/- 6.7% | 8911 ### Évolutions futures L'introduction de l'inférence de types rend **JägerMonkey** plus efficace que la combinaison des deux méthodes, c'est pourquoi le code de **TraceMonkey** sera supprimé dans une version ultérieure (probablement la version 11). La prochaine étape sera l’intégration d'un troisième compilateur à la volée, **IonMonkey**, qui pourrait être le dernier : ce compilateur devrait contribuer à stabiliser l'infrastructure de SpiderMonkey de par sa conception suffisamment propre et flexible pour permettre de nombreuses optimisations et expérimentations futures. ## MemShrink [MemShrink](https://wiki.mozilla.org/Performance/MemShrink) est un projet visant à réduire la consommation mémoire de Firefox, et de corriger les fuites de mémoires qui se présentent. Il a été lancé durant le cycle de développement de Firefox 7. Au total, c'est près de 90 bugs qui ont été corrigés dans cette version de Firefox. Parmi les changements notables, on trouve : * **Decode-on-draw** : les images ne sont plus décodées à l'ouverture d'une page mais à l'affichage de l'onglet, ce qui fait économiser mémoire et temps processeur. * **Lazy regexp** : la compilation JIT des expressions régulières est rendue « paresseuse », ce qui permet dans certains cas d'éviter leur compilation. * Une multitude d’optimisations d'alignement et d'allocation mémoire pour JavaScript. * Les compteurs de mémoire, qui permettent d'afficher les informations dans ont été grandement améliorés pour fournir des informations plus détaillées, permettant de nouvelles améliorations dans le futur. Pour plus d'informations sur MemShrink, voir le [blog de Nicholas Nethercote](http://blog.mozilla.com/nnethercote/). ## Vie privée Cette nouvelle version améliore l'utilisation de la fonction [[en:Do_not_track]] (« ne pas me pister », à activer dans les options du logiciel, onglet « Vie privée »). En effet il est dorénavant possible de vérifier en JavaScript si l'utilisateur accepte ou non d'être suivi. Rappelons que Do Not Track est une initiative de Mozilla qui vise à permettre à l'utilisateur d'indiquer explicitement qu'il ne souhaite pas être suivi. Celle-ci est actuellement en voie de discussion au W3C pour tenter de [créer un standard](http://www.w3.org/2011/11/dnt-pr.html.en). Google est évidemment farouchement opposé à ce mécanisme et préfère proposer [Keep My Opt-Outs](http://www.thesearchagents.com/2011/01/google-launches-keep-my-opt-outs/) qui consiste à s'inscrire chez des regroupements de publicitaires pour demander de ne plus être fiché. Il faut noter que Commission Fédérale du Commerce américaine recommande Do Not Track. ##Electrolysis Le travail sur Electrolysis, le projet pour séparer le processus d'affichage du processus gérant le contenu afin d'améliorer la réactivité, [a été stoppé](http://lawrencemandel.com/2011/11/15/update-on-multi-process-firefox-electrolysis-development/). Les développeurs se sont rendu compte que le travail était trop important (la première partie du projet, la séparation du processus des plug-ins, date de la version 3.6.4 et les développeurs ne peuvent toujours pas donner une date de fin) et mobilisait trop de monde qui pourrait être utile ailleurs. Ils ont donc jugé plus efficace de réaffecter ces personnes sur des projets moins imposants et qui avaient une date de fin prévisible beaucoup plus courte. Un des successeurs d'Electrolysis est le projet [Snappy](http://www.pcinpact.com/news/67444-mozilla-firefox-snappy-reactivite-projet.htm). Il vise : - une réactivité de 50ms lors de la frappe dans une zone de texte ; - rester à 60 images par seconde dans les opérations sur l’interface ; - vérifier les performances via la télémétrie ; - avoir un temps de démarrage comparable à celui de Chrome ou Internet Explorer ; - des fonctionnalités Précédent et Suivant aussi rapides que sous Opera.

AltStyle によって変換されたページ (->オリジナル) /