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 637
    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 637
    Points : 66 656
    Points
    66 656
    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>
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  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+
    Pour tout savoir sur l'utilisation du forum

    En postant votre message, n'oubliez pas les Règles du Club.

  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 637
    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 637
    Points : 66 656
    Points
    66 656
    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 ...
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  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
    Pour tout savoir sur l'utilisation du forum

    En postant votre message, n'oubliez pas les Règles du Club.

  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 637
    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 637
    Points : 66 656
    Points
    66 656
    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>
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  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 637
    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 637
    Points : 66 656
    Points
    66 656
    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>
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  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é ^^
    est ton ami fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes

    Premier ministre du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts )

  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 ;-)
    est ton ami fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes

    Premier ministre du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts )

  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 : 73
    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é !

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

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