IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Bonnes pratiques d'optimisation JS et gestion interne des variables


Sujet :

JavaScript

  1. #1
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Points : 2 161
    Points
    2 161
    Par défaut Bonnes pratiques d'optimisation JS et gestion interne des variables
    Bonjour,

    Depuis peu, un SDK est sorti pour pouvoir développer ses propres applications sur la Freebox ; le SDK est essentiellement basé sur un binding Javascript vers les Enlightment Fundation Libraries.

    Le processeur de la Freebox étant globalement peu puissant (un MIPS à peu près équivalent à un Pentium 60MHz), l'exécution de code Javascript interprété par SpiderMonkey montre rapidement ses limites.

    A titre d'exemple, j'ai codé un premier jet d'un mini moteur de physique (trivial) pour gérer les déplacements et collisions d'une dizaine boules de billard. Résultat: il n'arrive pas à gérer plus de 50 itérations par seconde.

    C'est pourquoi je recherche de la documentation sur les bonnes pratiques à adopter quand on code en Javascript afin d'optimiser un maximum toutes les parties critiques de mon code. Le but serait de mieux savoir à priori quelles opérations sont 'lourdes' et lesquelles plus 'efficientes' (genre instanciation d'une 'classe' JS, accès à une donnée membre d'une 'instance' vs. accès à une variable globale, etc ...)

    Toujours dans l'objectif d'optimiser faire mon petit moteur physique, j'ai pensé à éviter l'utilisation des calculs sur les nombres flottants car c'est un des domaines ou le MIPS est particulièrement mauvais. J'aimerais donc remplacer l'utilisation des nombres flottants par l'utilisation exclusive de nombres en 'fixed point' (*). Mais pour cela j'ai besoin de comprendre le fonctionnement interne des interpréteurs Javascript, notamment comment est stocké le contenu d'une variable (un flottant, un entier, ...) en mémoire. Quelqu'un aurait-il des pistes ?

    Merci d'avance



    (*) grosso modo, c'est stocker dans un mot de 32 bits (par exemple) un nombre décimal en disant que le premier bit est celui du signe ; les 16 suivants ceux de la partie entière et les 15 derniers ceux de la partie décimale. Ainsi, les calculs (addition, soustraction, multiplication, division) peuvent être faits uniquement grâce aux opérations de base sur des entiers (+,-,*,/) accompagnés d'opérations de décalage de bits (<<, >>, >>>).
    Mon projet du moment: BounceBox, un jeu multijoueurs sur Freebox, sur PC et depuis peu sur smartphone/tablette Android.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    313
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 313
    Points : 330
    Points
    330
    Par défaut
    Citation Envoyé par nouknouk Voir le message
    Toujours dans l'objectif d'optimiser faire mon petit moteur physique, j'ai pensé à éviter l'utilisation des calculs sur les nombres flottants car c'est un des domaines ou le MIPS est particulièrement mauvais. J'aimerais donc remplacer l'utilisation des nombres flottants par l'utilisation exclusive de nombres en 'fixed point' (*). Mais pour cela j'ai besoin de comprendre le fonctionnement interne des interpréteurs Javascript, notamment comment est stocké le contenu d'une variable (un flottant, un entier, ...) en mémoire. Quelqu'un aurait-il des pistes ?
    Pas trop de piste, mais j'imagine mal l'implémentation possible.
    J'ai bien l'impression que c'est peine perdu : il ne semble pas y avoir d'opération sur des entiers.
    Exemple avec une division :
    10/100 = 0.1,
    10/128 = 0.078125,
    10>>7 = 0,
    (10<<7)/(100<<7) = 0.1,
    ((10<<7)/100)>>7 = 0 MAIS ((10<<7)/100) = 12.8 ;
    Bref, pour moi il semble clair que sous javascript il semble impossible de forcer des calculs entiers sans float ou double intermédiaire. Pas de fixed point envisageable.

  3. #3
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Points : 2 161
    Points
    2 161
    Par défaut
    Citation Envoyé par kernelfailure Voir le message
    J'ai bien l'impression que c'est peine perdu : il ne semble pas y avoir d'opération sur des entiers.
    C'est malheureusement ce que j'ai cru comprendre entre temps via ce lien:

    Les nombres en JavaScript sont « des valeurs au format IEEE 754 en double précision 64 bits », d'après la spécification. Cela a quelques conséquences intéressantes. Il n'y a par exemple pas de type entier en JavaScript
    Mon projet du moment: BounceBox, un jeu multijoueurs sur Freebox, sur PC et depuis peu sur smartphone/tablette Android.

Discussions similaires

  1. Bonnes pratiques pour optimiser les jobs Talend.
    Par amallek dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 22/11/2014, 17h35
  2. [Bonnes Pratiques] Outils utilisés dans la gestion d'un projet informatique
    Par Babas007 dans le forum Débats sur le développement - Le Best Of
    Réponses: 4
    Dernier message: 16/07/2014, 13h05
  3. le fonctionnement interne des variables
    Par Invité dans le forum Débuter
    Réponses: 6
    Dernier message: 05/09/2011, 00h49
  4. Réponses: 8
    Dernier message: 14/12/2006, 11h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo