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

Langage PHP Discussion :

Meilleure façon d'affecter un tableau ?


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 63
    Points : 33
    Points
    33
    Par défaut Meilleure façon d'affecter un tableau ?
    Bonjour tout le monde !

    Voilà je me pose une question bête et je ne trouve ma réponse nul part.

    Au niveau des affectations de tableaux, c'est plus rapide un classique ou un associatif ?

    Par exemple, vaut-il mieux ceci...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    foreach ($segments as $value) {
            $data[$i][0] = $i;
            $data[$i++][1] = $value->getSize();
        }
    ... ou ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    foreach ($segments as $value) {
            $data[] = array(0 => $i, 1 => $value->getSize());
        }

  2. #2
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Niveau performance, l'écart entre les deux versions est totalement négligeable.

    Après c'est juste au niveau visuel que ça importe.

    Je n'utiliserai jamais la première version comme tu l'as faites, car elle demande de réfléchir pour bien comprendre ce qu'elle fait. Je l'utiliserai plutôt comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $i = 0; // toujours initialiser la variable, même si ce n'est pas nécessaire
    foreach ($segments as $value) {
            $data[$i][] = $i;
            $data[$i][] = $value->getSize();
            $i++;
        }
    Mais je préfère de toutes façons la deuxième et qui est plus courte et plus compréhensible, même au premier coup d'oeil.
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  3. #3
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ta question portant sur "la meilleure" je répond la deuxième qui est plus lisible.

    Après on peut toujours s'amuser a mesurer les temps d’exécution et chez moi la première est plus rapide (0,5s pour 2millions d’itération).
    Mais c'est souvent un mauvais calcul de se focaliser sur les questions d'écriture : au lieu de se demander si telle syntaxe économise un millième de seconde par page, on peut se demander de quelle façon organiser le traitement pour ne pas avoir a faire ces manipulations de tableau par exemple.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    Merci à tous les deux !

    Spartacusply : Oui t'inquiètes j'initialise toujours mes itérateurs ^^ c'est juste une erreur de copier/coller sans doute ;D

    Et sinon quand je voulais dire meilleur je parlais surtout de la rapidité.

    sabotage : Si tu es sûr de toi, je prendrais donc la 1er méthode, même si ça fait un peu plus autiste ^^

  5. #5
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu peux faire la mesure toi même sur ton serveur pour voir.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    Bah en fait rien qu'avec la même méthode, d'un test à un autre, j'ai parfois un jeu de plus de 2 secondes.
    Puis les méthodes hasardeuses wait&see.
    C'était pour savoir si il y avait déjà eu des retours sur ça, ou une normalisation... L'avis de pro quoi... etc...

  7. #7
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Citation Envoyé par sabotage Voir le message
    chez moi la première est plus rapide (0,5s pour 2millions d’itération).
    C'est un peu hors-sujet, mais tu fais comment ces tests précis, Sabotage, avec quel outil ?
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    Bon après avoir fais des tests aussi, je confirme Sabotage ^^

    Perso, je me suis servi de la fonction une au début du script, une à la fin, une petite différence et on connaît le temps d'exec du script.

    Merci à vous !

  9. #9
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Merci Gégé, vais aller voir cette fonction.
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  10. #10
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    À moins que tu aies des tableaux contenant des millions de données (mais dans ce cas, soit tu es Facebook soit tu as un problème d'architecture), ce genre de microoptimisation ne sert qu'à satisfaire une curiosité intellectuelle. Écrits de la manière la plus facile à comprendre pour toi (et pour ceux qui liront ton code plus tard).

  11. #11
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    J'ai refais des mesures : dans mon premier test j'incrementais mal le tableau sur le premier test.
    Résultat : 0,7s de mieux pour 2millions d'iterations pour la syntaxe array()
    Comme quoi ...
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  12. #12
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    C'est vraiment chipoter pour rien

    Pour que ce genre d'optimisation soit "pertinente", il faut d'abord aller lire le code source C du PHP pour comprendre comment ces différents cas sont traités par le moteur.

    Dans la même lignée : $data[$i++] est lui aussi optimisable comme ceci : $data[++$i]. Le $i++ entraîne la copie de la variable $i avant incrémentation alors que ++$i s'en passe. Gain moyen de performance 10%.

    Cette démarche est inutile dans 99,99% des cas. Mis à part de très très gros sites, l'intérêt est nul. Et encore si vous prenez un site comme FB, ils ont carrément préféré recoder un genre de PHP maison répondant mieux à la charge de traitement à encaisser.
    C'est dire la plus-value apportée par ces micro-optimisations...

    Quitte à optimiser, privilégiez plutôt l'organisation du projet, la lisibilité du code et sa documentation.

  13. #13
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Dans la même lignée : $data[$i++] est lui aussi optimisable comme ceci : $data[++$i]. Le $i++ entraîne la copie de la variable $i avant incrémentation alors que ++$i s'en passe. Gain moyen de performance 10%.
    Non, avec la syntaxe ++$i, php va incrémenter la variable avant d'affecter la variable ce qui fait que tous les $value->getSize() seront décalés d'un rang dans le tableau.

    Mais par contre totalement d'accord sur la conclusion.

    J'ai refais des mesures : dans mon premier test j'incrementais mal le tableau sur le premier test.
    Résultat : 0,7s de mieux pour 2millions d'iterations pour la syntaxe array()
    Comme quoi ...
    Je confirme également ce résultat, l'affectation par la syntaxe array est plus rapide.

    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
    <?php
     
    $segments = range(0, 2000000);
     
    $data = array();
    $i = 0;
    $timeStart = microtime(true);
    foreach ($segments as $value) {
        $data[$i][0] = $i;
        $data[$i++][1] = $value;
    }
    $timeEnd = microtime(true);
     
    echo "Test 1 : " . ($timeEnd - $timeStart);
    echo "<br>";
     
    $data = array();
    $i = 0;
    $timeStart = microtime(true);
    foreach ($segments as $value) {
        $data[] = array(0 => $i, 1 => $value);
    }
    $timeEnd = microtime(true);
     
    echo "Test 2 : " . ($timeEnd - $timeStart);
     
    //Affiche :
    Test 1 : 2.905289888382
    Test 2 : 1.3451337814331
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  14. #14
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par Spartacusply Voir le message
    Non, avec la syntaxe ++$i, php va incrémenter la variable avant d'affecter la variable ce qui fait que tous les $value->getSize() seront décalés d'un rang dans le tableau.
    Je ne me suis attardé que sur l'optimisation du $i++, mais il va de soit que si t'es rendu à ce genre de retouche c'est que naturellement tu décales le compteur de -1 et du coup $i = -1; avant la première itération.

    Bon, à vrai dire je ne me pose plus du tout la question, chez moi c'est carrément un automatisme

  15. #15
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Tu décales juste le problème en changeant la valeur de $i avant la première itération, mais la problématique reste la même.
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  16. #16
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par Spartacusply Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $i = 0; // toujours initialiser la variable, même si ce n'est pas nécessaire
    foreach ($segments as $value) {
            $data[$i][] = $i;
            $data[$i][] = $value->getSize();
            $i++;
        }
    est équivalent à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $i = -1;
    foreach ($segments as $value) {
        $data[++$i][] = $i;
        $data[$i][]   = $value->getSize();
    }

  17. #17
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Aaah ok, je partais sur le principe que tu ne changeais pas la ligne d'affectation de $i.
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  18. #18
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Points : 1 022
    Points
    1 022
    Par défaut
    la je vois bien les fonctions natives sont rapides...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $sortie = array();
    foreach ($segments as $value) {
        array_push($sortie, $value->getSize());
     }
    Conception / Dev

  19. #19
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par ascito Voir le message
    la je vois bien les fonctions natives sont rapides...
    Tout à fait
    Il faut toujours privilégier une structure du langage aux fonctions. Le rapport en matière de temps d'exécution peut atteindre 1000.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    array_push($data, $value) => $data[] = $value;
    is_null($value)           => ($value === null);
    etc...

Discussions similaires

  1. Liste d'objets, quel est la meilleure façon
    Par shirya dans le forum C++
    Réponses: 2
    Dernier message: 08/12/2005, 16h59
  2. affecter un tableau à un autre
    Par pascaldengis dans le forum C
    Réponses: 2
    Dernier message: 23/11/2005, 17h54
  3. Est ce bien la meilleure façon de faire un histogramme ?
    Par rvzip64 dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 10/05/2005, 12h41
  4. problème d'affectation de tableau ...
    Par Mike888 dans le forum C
    Réponses: 23
    Dernier message: 26/02/2005, 14h52
  5. Meilleure Méthode pour parcourir un tableau
    Par KPitN dans le forum MFC
    Réponses: 7
    Dernier message: 24/02/2005, 16h19

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