asm.js s'approche des performances du code natif C/C++
Mozilla optimise son sous-ensemble de JavaScript
Le 2013-12-24 07:21:32, par Hinault Romaric, Responsable .NET
JavaScript jouit d’une grande popularité. Le langage de script est devenu une plateforme incontournable pour le Web.
Cependant, il souffre de quelques faiblesses, notamment ses performances par rapport aux langages de développement d’applications natives.
Pour pallier à cela, Mozilla a développé asm.js, un sous-ensemble de JavaScript, dont le but est de maximiser les performances du langage de script pour le Web.
D’après la description de Mozilla, asm.js est – purement - du code JavaScript « spécialement conçu », qui est compilé en langage natif C/C++ avec emscripten avant exécution. Avec asm.js, les développeurs peuvent écrire du code C/C++ et l’exécuter dans le navigateur grâce à emscripten.
Initialement, le code asm.js exécuté avec un navigateur standard comme Chrome pouvait être dix fois plus lent que du code natif. Grâce à des optimisations, la fondation Mozilla avait réussi à rendre le code asm.js environ trois fois plus lent que du code natif en février, et deux fois plus lent en juin.
L’organisme ne s’est pas arrêté en si bon chemin, et dévoile aujourd’hui les nouvelles performances de sa solution. Grâce à des changements apportés à la façon dont les virgules flottantes sont manipulées, asm.js est désormais au pire lent de 1,5 fois par rapport au natif.
asm.js pour fonctionner dans un navigateur nécessite un support explicite du moteur JavaScript. Depuis Firefox 22, Mozilla a activé le support de asm.js dans son moteur SpiderMonkey.
Source : Mozilla
Et vous ?
Que pensez-vous de asm.js ?
Cependant, il souffre de quelques faiblesses, notamment ses performances par rapport aux langages de développement d’applications natives.
Pour pallier à cela, Mozilla a développé asm.js, un sous-ensemble de JavaScript, dont le but est de maximiser les performances du langage de script pour le Web.
D’après la description de Mozilla, asm.js est – purement - du code JavaScript « spécialement conçu », qui est compilé en langage natif C/C++ avec emscripten avant exécution. Avec asm.js, les développeurs peuvent écrire du code C/C++ et l’exécuter dans le navigateur grâce à emscripten.
Initialement, le code asm.js exécuté avec un navigateur standard comme Chrome pouvait être dix fois plus lent que du code natif. Grâce à des optimisations, la fondation Mozilla avait réussi à rendre le code asm.js environ trois fois plus lent que du code natif en février, et deux fois plus lent en juin.
L’organisme ne s’est pas arrêté en si bon chemin, et dévoile aujourd’hui les nouvelles performances de sa solution. Grâce à des changements apportés à la façon dont les virgules flottantes sont manipulées, asm.js est désormais au pire lent de 1,5 fois par rapport au natif.
asm.js pour fonctionner dans un navigateur nécessite un support explicite du moteur JavaScript. Depuis Firefox 22, Mozilla a activé le support de asm.js dans son moteur SpiderMonkey.
Source : Mozilla
Et vous ?
-
jojosbizMembre habituéOué, c'est bien ce que je pensai..
On en revient à essayer de faire entrer un triangle dans un rond avec un marteau tout en se persuadant que le triangle finira bien par devenir un rond...le 24/12/2013 à 9:50 -
UtherExpert éminent sénior
Envoyé par Hinault Romaric
Le code asm.js n'est pas compilé en C/C++, mais directement en code machine et enscriptem ne permet pas du tout d'exécuter du javascript.
C'est le code C/C++ qui est compilé via enscriptem en code javascript simplifié(asm.js). Cette opération est faite par le développeur qui intègrera le code généra sur son site, pas par le navigateur.
Ce code javascript pourra donc etre chargé et executé de manière efficace par tous les navigateurs. Cependant sur les navigateurs optimisés pour le asm.js, il est compilé en code machine en AOT (en une seule fois contrairement au JIT qui est compilé a la volée) ce qui permet des performances proches du natif.Envoyé par Faridsarl
S'il arrivaient à descendre à 1.2x, ça serait déjà énorme.
Envoyé par jojosbiz
- Pouvoir faire des applications web efficace avec des performances proches du natif.
- Pouvoir développer des applications web avec des langages plus structurés que le Javascript
- Pouvoir réutiliser facilement les nombreux code C/C++ utilisés dans les application bureau pour des applications weble 24/12/2013 à 9:38 -
UtherExpert éminent séniorEn effet, mais il faut voir qu'on a pas le choix, JavaScript étant le seul langage nativement reconnu par tous les navigateurs. L'idéal aurait été un bytecode standardisé, malheureusement ça n'est pas prêt d'arriver.
Ca semble bien parti : même si les développeurs de Chrome se refusent de considérer asm.js en tant que vrai sous langage de JavaScript, ils ont introduit dans webkit des optimisations spécifiques a emscripten qui font qu'au final le code qui suit les règles de asm.js bénéficie de ses optimisations.
A la base emscripten est un backend LLVM qui génère du JavaScript. Cela signifie qu'il permet de compiler en JavaScript tous les langages qui on un frontend LLVM (le plus connu étant étant Clang pour le C/C++).
Donc pour l'intégration c'est le développeur qui compile son code C/C++/D/... en JavaScript une fois pour toute et l’ajoute dans son site. Le navigateur du client l’exécutera comme n'importe quel JavaScript, avec des optimisations si il le supporte.
Les objectifs sont en effet assez semblable : de meilleures performances et pouvoir utiliser des langages plus stricts.
Les moyens sont différents : Dart est un nouveau langage, la où Mozilla propose de choisir son langage qui sera compilé en un JavaScript très optimisable.
je ne connais angular.js que de nom mais comme asm.js permet de faire des fonctions pont entre le code compilé et le JavaScript classique, je suppose que ça doit être possible.le 25/12/2013 à 16:39 -
DonQuicheExpert confirméPour moi l'avenir du web passe soit par asm.js soit par NaCl parce que ce sont les deux solutions significatives qui pourraient nous permettre d'utiliser les langages de notre choix avec des performances natives. On n'a pas besoin d'un langage de plus mais d'une solution neutre comme celles-ci.
Petite préférence tout de même pour NaCl, le poids du code asm.js semble énorme, même compressé.
Tu codes en ce que tu veux et un code javascript est généré. Ce code javascript est licite, 100% compatible mais "bizarre" avec des choses telles que "x|0" ou l'appel à des fonctions "var" ou "box2b" ressemblant à des instructions bytecode.
Ce code tourne sur un navigateur ne supportant pas asm.js. Toutefois, un navigateur asm.js reconnaît que "x|0" contraint x à être un entier, et interprétera box2b et var comme étant des opcodes plutôt que d'appeler ces fonctions. Au final ce code javascript peut facilement être vérifié, être fortement et statiquement typé et être finalement compilé en un code natif très rapide.Ca fait penser à dart. Je me trompe ?J'aimerais aussi savoir si on peut coupler ça avec des frameworks comme angularjsle 24/12/2013 à 16:14 -
jojosbizMembre habituéPas compris du tout l’intérêt de tout ça.
Quelqu'un est-il capable de me l'expliquer ?le 24/12/2013 à 9:12 -
Skull57Membre à l'essaiPas compris du tout l’intérêt de tout ça.
Quelqu'un est-il capable de me l'expliquer ?
Un cas concret: Si un jeu tourne à 60FPS sur ton PC, alors, comme c'est sensé être 1.5x plus lent sur le web, le jeu est sensé tourner à 60/1.5=40FPS si tu y joues en HTML5 avec asm.js.
Après, faut voir à quels domaines ça s'applique. Les jeux-vidéos genre crysis envoie du code assembleur directement à la carte graphique, faut voir si le HTML5 permet de telles optimisations... (+ tout ce qui est utilisation/modification du pipeline graphique, mais comme j'ai jamais touché)le 24/12/2013 à 9:41 -
dkMembre actif
Que pensez-vous de asm.js ?
Si tous les navigateurs le prennent en charge aussi efficacement, ça va clairement devenir l'avenir du web, les gros atouts étant les performances et la génération à partir de c/c++ ; plus besoin de plugins et/ou machine virtuelle également, donc moins de problèmes de sécurité tout en restant multisupport.le 24/12/2013 à 10:19 -
renooMembre éprouvéjuste une petite remarque emscripten ça permet de compiler du code c/c++ en javascript normal ou en asm.js. les perfs sont meilleurs avec asm.js sous firefox.
Par ailleurs asm.js est un sous ensemble de js ; donc ca marche sur tout les navigateurs mais ca va très vite que sur firefox.le 24/12/2013 à 11:10 -
OrwelMembre du ClubPetite préférence tout de même pour NaCl, le poids du code asm.js semble énorme, même compressé.
De plus, NaCl est du code compilé. Un comparatif intéressant serait avec PNaCl, qui comme du asm.js, est destiné à être compilé par le navigateur en code natif.le 25/12/2013 à 18:50 -
trallocMembre avertiJ'aimerais bien voir des exemples. Ca a l'air très bien.
@Uther pour une fois je n'ai pas compris toutes tes explications.
Si j'ai bien compris : On code en C ou en C++ puis on le compile.
Ensuite qu'est ce qui se passe ?
Comment on intègre ça dans le code ? Comment fais-t-on le lien dans la page html ? On le fait sur le code C compilé (genre dll), ou sur un JS qui passe à la moulinette le code compilé (version simplifiée) généré par le fameux asm.js ?
Ca fait penser à dart. Je me trompe ?
Ensuite comment fais-ton pour accéder aux ressources de la page ?
J'aimerais aussi savoir si on peut coupler ça avec des frameworks comme angularjsle 24/12/2013 à 15:32