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 :

[DOM] Pourquoi JS est-il si lent ?


Sujet :

JavaScript

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 26
    Points : 22
    Points
    22
    Par défaut [DOM] Pourquoi JS est-il si lent ?
    Bonjour,

    Je suis un nouvel adepte de JS. Cela m'ouvre des presepectives assez interessantes (notamment par rapport au php). Par contre, je suis surpris par sa lenteur meme pour un langage non compile.

    Par exemple, dans un de mes premiers script, mon code JS
    genere un tableau (dont le nombre de colonnes depend d'un parametre).
    On peut quasiment voir les colonnes se creer une a une ! (bon, j'exagere,
    mais je pensais que ce serait tellement instantanee qu'on n'aurait pas le temps de percevoir la page contenant le tableau vide avant construction
    des colonnes).

    D'ou ma question:
    Quelles sont les bonnes pratiques pour optimiser un code JS ?
    Quelles sont les commandes a eviter (ou tout du moins dont il ne faut pas abuser) ?
    Est-ce que ce probleme de lenteur est specifique a la manipulation de l'arbre DOM ? Dans ce cas, concerne-t-il tous les types de manipulations (creation/suppression/deplacement d'un noeud) ?

    Bon, c'est un peu vaste comme debat, mais j'aimerais bien profiter de votre experience dans ce domaine...

    Olivier.

  2. #2
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 650
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 650
    Points : 11 143
    Points
    11 143
    Par défaut
    bonjour,

    ton tableau a combien de lignes et de colonnes ?
    Peux-tu nous montrer ton code ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 26
    Points : 22
    Points
    22
    Par défaut
    Euh... 18 colonnes 3 lignes.

    Le tableau et les 3 lignes sont deja dans le code html.
    Je rajoute les noeuds td un a un apres que la page ait ete chargee.
    (bon c'est surement pas optimal, car on doit pourvoir dupliquer les noeuds plutot qu'en creer de nouveaux a chaque fois... mais j'ai pas essaye).

  4. #4
    Expert confirmé
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Points : 4 045
    Points
    4 045
    Par défaut
    Salut,

    Effectivement peux tu passer ton code ?
    En matière de création de HTML à la volée, 2 possibilités: soit tu passes par le DOM comme je suppose tu le fais, et alors diverses optimisations et règles d'utilisations sont envisageables, soit tu crées le code HTML sous la forme d'une chaine et tu l'injectes dans ta page via la propriété innerHTML des objets.

    En matière de test de performances tu trouveras d'excellentes infos ici.

    ERE

  5. #5
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Points : 4 835
    Points
    4 835

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 26
    Points : 22
    Points
    22
    Par défaut Mea culpa...
    Dans l'optique de vous presenter un code lisible, je l'ai debarassé de tout ce qui etait superflu pour ne conserver que la partie creation du tableau... et suprise quand je teste le script (sans rien d'autre), ca fonctionne comme je l'attendais: on ne percoit pas le tableau vide avant qu'il ne soit rempli...

    Donc, le probleme est ailleurs: et j'ai trouve ! Je chargeais une image
    en fond d'ecran, or la creation du tableau ne commence que lorsque l'image est entierement chargee (j'utilise l'evenement window.onload pour declencher la creation du tableau)... bete n'est-ce pas (j'espere que vous me pardonnerez, je debute) ? Cela me rassure un peu sur le potentiel de JS.

    J'ai vu que Jquery permettait d'eviter ce probleme (en utilisant onread au lieu de onload)... Bon, a prori, je ne suis pas fana a l'idee d'utiliser Jquery pour profiter d'1 ou 2 fonctions (je prefere de toute facon tout faire moi meme, au moins au debut... c'est tout de meme instructif). Si quelqu'un sait comment onread fonctionne, ca m'interesse (ceci dit, si c'est trop complexe, laissez tomber, j'essaierai de mettre mon nez moi meme dans jQuery pour comprendre si j'en trouve le temps).

    Ceci dit, de maniere plus general, comme je debute, je prefere prendre d'ores et deja des bonnes habitudes, notamment en ce qui concerne l'optimisation. Ma premiere impression (fausse) me laissait croire que JS etait vraiment tres lent et que du coup optimiser un script etait absolument vital. Bon, c'est peut-etre moins crucial que je ne m'imaginais, mais tant qu'a faire autant partir sur un bon pied.

    Merci pour les references concernant l'optimisation et les perfs.
    Je vais potasser tout ca.

    olivier.

  7. #7
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 650
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 650
    Points : 11 143
    Points
    11 143
    Par défaut
    Citation Envoyé par olivierPa Voir le message
    Je chargeais une image
    en fond d'ecran, or la creation du tableau ne commence que lorsque l'image est entierement chargee (j'utilise l'evenement window.onload pour declencher la creation du tableau)... bete n'est-ce pas (j'espere que vous me pardonnerez, je debute) ?
    de toute façon tant que la page n'est pas chargée tu ne peux pas lancer la création du tableau donc tu n'as pas le choix : tu dois appeler ta fonction lors du onload.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 26
    Points : 22
    Points
    22
    Par défaut
    Oui, mais avec ready (de JQuery - et non onread... je m'etais trompe dans mon precedent post), on peux manipuler le DOM avant que les images ne soient chargees, non ? (je n'ai pas teste).

    Sinon, le lien envoye par ERE est vraiment interessant... et me pousse a me convertir a Opera ! et a utiliser innerHTML (je sais, c'est tres mal, mais bon, quand on considere les tests presentes, il est difficile de resister).

    olivier.

Discussions similaires

  1. Pourquoi Firefox est si lent
    Par Lucas Panny dans le forum Firefox
    Réponses: 4
    Dernier message: 19/10/2011, 08h09
  2. [SSE] Pourquoi est-ce plus lent?
    Par Meseira dans le forum C
    Réponses: 3
    Dernier message: 20/05/2011, 08h41
  3. Réponses: 7
    Dernier message: 11/02/2010, 20h40

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