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

Contribuez Discussion :

[SRC] Construire un grand tableau plus rapidement


Sujet :

Contribuez

  1. #1
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 663
    Points
    66 663
    Billets dans le blog
    1
    Par défaut [SRC] Construire un grand tableau plus rapidement
    Suite à un post sur le forum, je vous propose un code pour contruire dynamiquement un tableau (balise <table>) plus rapidement

    Dans cet exemple un tableau de 100 x 100 soit 10 000 cellules en moins de 3 secondes et demi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
     
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
     
    <title>Nouvelle page 1</title>
    <script type='text/javascript'>
    /***************************
    * Speed Table By SpaceFrog *
    **************************/
     
    function BuildTable(DestObj,NrLines,NbrCells){
    var BaliseTable=document.createElement('table');
    var BaliseTbody=document.createElement('tbody');
     
    for(i=0;i<NrLines;i++){
     new AddLine(BaliseTbody,NrLines,NbrCells, i)
     }
     
    BaliseTable.appendChild(BaliseTbody);
    DestObj.appendChild(BaliseTable);
    document.close();
    }
     
    function AddLine(DestBody,NrLines,NbrCells, Contenu){
    var NewLine=document.createElement('tr');
    for(l=0;l<NbrCells;l++){
         new AddCells(NewLine,Contenu+'_'+l);
         }
    DestBody.appendChild(NewLine)      
     
    }
     
    function AddCells(DestLine,contenu){
    var newCell=document.createElement('td');
    newCell.style.border="solid 1px gray";
    newCell.appendChild(document.createTextNode(contenu));
    DestLine.appendChild(newCell);
    }
     
    </script>
     
     
     
     
    </head>
     
    <body onload="BuildTable(document.body,100,100)">
     
     
    </body>
     
    </html>

  2. #2
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Points : 36 571
    Points
    36 571
    Par défaut
    Puisque tu es dans l'optimisation, remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    newCell.style.border="solid 1px gray";
    par une redéfinition CSS des <td> (au niveau global, et non pour chaque) fera peut-être gagner quelques ms supplémentaires (et quelques octets en poids)

    A+

  3. #3
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 663
    Points
    66 663
    Billets dans le blog
    1
    Par défaut
    oui un css au niveau de la page ... ou un className ... ferait sans doute encore gagner quelques centièmes ...
    Mais déja passer de 25 secondes à même pas 3.5 ...

  4. #4
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Points : 36 571
    Points
    36 571
    Par défaut
    Citation Envoyé par SpaceFrog Voir le message
    Mais déja passer de 25 secondes à même pas 3.5 ...
    Loin de moi l'idée de minimiser l'efficacité de la solution

  5. #5
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 663
    Points
    66 663
    Billets dans le blog
    1
    Par défaut
    Pour le fun:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
    <style type='text/css'>
    td {height:5px;
        width:5px;}
        </style> 
    <title>Nouvelle page 1</title>
    <script type='text/javascript'>
    /***************************
    * Speed Table By SpaceFrog *
    **************************/
     
    function BuildTable(DestObj,NrLines,NbrCells){
    var BaliseTable=document.createElement('table');
    BaliseTable.style.borderCollapse="collapse";
    var BaliseTbody=document.createElement('tbody');
     
    for(i=0;i<NrLines;i++){
     new AddLine(BaliseTbody,NrLines,NbrCells, i)
     }
     
    BaliseTable.appendChild(BaliseTbody);
    DestObj.appendChild(BaliseTable);
    document.close();
    }
     
    function AddLine(DestBody,NrLines,NbrCells, Contenu){
    var NewLine=document.createElement('tr');
    for(l=0;l<NbrCells;l++){
         new AddCells(NewLine,Contenu*2+l);
         }
    DestBody.appendChild(NewLine)      
     
    }
     
    function AddCells(DestLine,contenu){
    var newCell=document.createElement('td');
    newCell.style.backgroundColor="rgb("+contenu+",50,100)";
    newCell.appendChild(document.createTextNode("   "));
    DestLine.appendChild(newCell);
    }
     
    </script>
     
     
     
     
    </head>
     
    <body onload="BuildTable(document.body,100,100)">
     
     
    </body>
     
    </html>
    ou encore :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
    <style type='text/css'>
    td {height:5px;
        width:5px;}
        </style> 
    <title>Nouvelle page 1</title>
    <script type='text/javascript'>
    /***************************
    * Speed Table By SpaceFrog *
    **************************/
     
    function BuildTable(DestObj,NrLines,NbrCells){
    var BaliseTable=document.createElement('table');
    BaliseTable.style.borderCollapse="collapse";
    var BaliseTbody=document.createElement('tbody');
     
    for(i=0;i<NrLines;i++){
     new AddLine(BaliseTbody,NrLines,NbrCells, i)
     }
     
    BaliseTable.appendChild(BaliseTbody);
    DestObj.appendChild(BaliseTable);
    document.close();
    }
     
    function AddLine(DestBody,NrLines,NbrCells, Contenu){
    var NewLine=document.createElement('tr');
    for(l=0;l<NbrCells;l++){
         new AddCells(NewLine,Contenu,l);
         }
    DestBody.appendChild(NewLine)      
     
    }
     
    function AddCells(DestLine,contenu1,contenu2){
    var newCell=document.createElement('td');
    newCell.style.backgroundColor="rgb("+contenu1+","+contenu2*2+","+(255-contenu1)+")";
    newCell.appendChild(document.createTextNode("   "));
    DestLine.appendChild(newCell);
    }
     
    </script>
     
     
     
     
    </head>
     
    <body onload="BuildTable(document.body,100,100)">
     
     
    </body>
     
    </html>

  6. #6
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 663
    Points
    66 663
    Billets dans le blog
    1
    Par défaut
    Suite à la découverte que le cloneNode est plsu rapide que le createElement, voici une petit améliortaion qui permet de gagner encore un peu de temps à la création:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
     
    <title>Nouvelle page 1</title>
    <script type='text/javascript'>
    /***************************
    * Speed Table By SpaceFrog *
    **************************/
    var xtable=document.createElement('table');
    var xtbody=document.createElement('tbody');
    var xtr=document.createElement('tr');
    var xtd=document.createElement('td');
    var xtxt=document.createTextNode('');
     
     
    function BuildTable(DestObj,NrLines,NbrCells){
    var BaliseTable=xtable.cloneNode(false);
    var BaliseTbody=xtbody.cloneNode(false);
     
    for(i=0;i<NrLines;i++){
     new AddLine(BaliseTbody,NrLines,NbrCells, i)
     }
     
    BaliseTable.appendChild(BaliseTbody);
    DestObj.appendChild(BaliseTable);
    document.close();
    }
     
    function AddLine(DestBody,NrLines,NbrCells, Contenu){
    var NewLine=xtr.cloneNode(false);
    for(l=0;l<NbrCells;l++){
         new AddCells(NewLine,Contenu+'_'+l);
         }
    DestBody.appendChild(NewLine)      
     
    }
     
    function AddCells(DestLine,contenu){
    var texte=xtxt.cloneNode(false);
    var newCell=xtd.cloneNode(false);
    newCell.style.border="solid 1px gray";
    texte.data=contenu;
    newCell.appendChild(texte);
    DestLine.appendChild(newCell);
    }
     
    </script>
     
     
     
     
    </head>
     
    <body onload="BuildTable(document.body,100,100)">
     
     
    </body>
     
    </html>

  7. #7
    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
    Par défaut
    effectivement cloneNode est plus rapide
    et pour finir , tu peux faire une boucle inversé avec un while et la boucle sera bouclé ^^

  8. #8
    Inactif
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 117
    Points : 142
    Points
    142
    Par défaut
    avec code de spacefrog :
    console.time('test SpaceFrog');
    BuildTable(document.body,100,100);
    console.timeEnd('test SpaceFrog');
    ==>544ms


    Mais il n'y a rien de mieux que la toute puissance des chaines de caractères

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    /***************************
    * Speed Table By Gatsu35  *
    **************************/
     
    function BuildTable(DestObj,NrLines,NbrCells){
        var div = document.createElement('div');
        var array = [];    
        array.push('<table><tbody>');
         for (var i=0; i<NrLines; i++) {
           array.push('<tr>');
           var cells= [];
            for(var j=0; j<NbrCells; j++) {
                array.push('<td style="border:1px solid gray">'+i+'_'+j+'</td>');
            }
           array.push('</tr>');
        }
        array.push('</tbody></table>');
        div.innerHTML = array.join('');
        DestObj.appendChild(div.getElementsByTagName('table')[0]);    
    }
     
     
    console.time('test SpaceFrog');
    BuildTable(document.body,100,100);
    console.timeEnd('test SpaceFrog');
    ==> 325ms

  9. #9
    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
    Par défaut
    Salut Gatsu35 effctivement sujet déja évoqué , innerHTML est plus rapide que le dom ;-)

  10. #10
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut
    SPaceFrog devient le « Speedy Gonzalez » de la table !



    Adopté !

Discussions similaires

  1. la Recherche la Plus Rapide dans un tableau
    Par linuxeur dans le forum C
    Réponses: 10
    Dernier message: 23/05/2008, 00h07
  2. Copie d'un tableau dans un tableau plus grand
    Par oodini dans le forum Débuter
    Réponses: 3
    Dernier message: 24/09/2007, 16h09
  3. Réponses: 13
    Dernier message: 07/01/2007, 19h43
  4. Grand tableau qui prend plus d'une page
    Par Rabie de OLEP dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 1
    Dernier message: 03/01/2007, 22h22
  5. Accès le plus rapide: Pointeur ou tableau?
    Par homeostasie dans le forum C
    Réponses: 21
    Dernier message: 01/09/2006, 14h08

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