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 :

Les références et PHP


Sujet :

Langage PHP

  1. #1
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut Les références et PHP
    Bonjour, je vois souvent en surfant que l'utilisation des références optimise le code et le simplifie. Pour ce qui est de la simplification, dans certains cas de figures, je n'en doute pas (non utilisation des return des fonctions par exemple) mais pour ce qui est de l'optimisation...

    Au maximum, j'optimise de 1-2% sur un code que j'utiliserai probablement jamais...

    A moins que je n'ai pas réellement compris l'intérêt des références et quand les utiliser judicieusement...

    Et vous, dans quelles circonstances utilisez vous les références si vous les utilisez ?

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    A titre perso j'utilise quasiment jamais de refs.

    Dans l'exemple que tu donnes, les fonctions sans return, j'aime pas du tout et à moins de vraiment pas avoir le choix (cas que ne s'est pour le moment jamais présenté) je préfère largement qu'une fonction renvoie un résultat (question de cohérence de code).

    Sinon, parfois lorsqu'on voit quelque chose de ce genre :
    Selon le contenu du champ 'var', il pourrait être mieux d'utiliser une référence au lieu de dupliquer la variable, mais c'est rarement problématique.

    J'avais lu quelque part (mais c'est très vieux) que dans la plupart des cas, créer une ref était moins performant qu'une copie en terme de vitesse d'exécution (quand bien même cela serait vrai, c'est surement de l'ordre infinitésimal donc sans grande importance)

    Enfin, à partir du moment ou tu commences à travailler en OO, les références apportent énormément de confort. Ce qui tombe bien vu que les objets sont systématiquement créés par référence, ce qui fait que tu n'as pas à t'en préoccuper.
    Pourfendeur de singletons en croisade

  3. #3
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Merci de ta réponse. J'ai testé ce code (bidon) :

    Code php : 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
     
    <?php
     
    function ref($iter){
     
    	$monTab = array('hjkhuihuhuuuuuuuuuuuuuj', 58, 'jjpjoijp', 'n,ljkllllllj', 99);
    	$monTab2 = array();
     
    	$t1 = microtime(true);
    	for($i=1; $i<=$iter; $i++)
    		$monTab2 = $monTab;
    	$t2 = microtime(true);
     
    	$t3 = microtime(true);
    	for($i=1; $i<=$iter; $i++)
    		$monTab2 = &$monTab;
    	$t4 = microtime(true);
     
    	$temps_sans_ref = $t2-$t1;
    	$temps_avec_ref = $t4-$t3;
     
    	echo 'Sans les références : '.$temps_sans_ref.'<br />';
    	echo 'Avec les références : '.$temps_avec_ref.'<br />';
    	echo 'Gain en pourcentage avec les références : '.number_format((($temps_sans_ref-$temps_avec_ref)/$temps_sans_ref*100), 3).'%<br />';;
     
    }
     
    	ref(10);
            // Affiche :
            // Sans les références : 7.1525573730469E-6
            // Avec les références : 3.0994415283203E-6
            // Gain en pourcentage avec les références : 56.667%
     
            ref(1000);
            // Affiche :
            // Sans les références : 0.00011110305786133
            // Avec les références : 0.00010514259338379
            // Gain en pourcentage avec les références : 5.365%
     
            ref(100000);
            // Affiche :
            // Sans les références : 0.010226011276245
            // Avec les références : 0.010044097900391
            // Gain en pourcentage avec les références : 1.779%
     
            ref(100000000);
            // Affiche :
            // Sans les références : 9.8694341182709
            // Avec les références : 9.7905080318451
            // Gain en pourcentage avec les références : 0.800%
     
     
    ?>

    Meme si les pourcentages fluctuent beaucoup (notamment pour les premières valeurs) il semblerait que les références deviennent de moins en moins efficaces avec de lourds traitements ce que j'ai du mal a comprendre car finalement tout mon code repose sur mes 2 boucles traitant ou non les refs. Comment expliquer ces resultats ? Le moteur php optimiserait il le code en cas d'actions répétées telles celles de mes boucles (ie: est ce qu'il peut de lui meme passer les variables par references sans que cela lui ai été préalablement dicté ) ?
    Merci de vos remarques ou suggestions

  4. #4
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut
    si tu veux une grosse différence au niveau des perfs, pas la peine d'utiliser une assignation par référence, regarde plutôt du coté des passages de valeur par référence.

    ton test $monTab2 = &$monTab; dans une boucle est inutile puisque faire une seule fois $monTab2 = &$monTab suffit à faire pointer les 2 variables vers le même contenu.
    au contraire $monTab2 = $monTab; provoque à chaque fois une copie ce qui explique le gros écart de perf entre les 2.

    pour tester le passage de valeur par référence, tu pourrais faire ca :
    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
    set_time_limit(30);
     
     
    $b = new bench(8, 4);
     
    $tb = array();
    for($i = 0; $i < 1000; $i++) array_push($tb, $i);
     
     
    function sansRef($tb){
        foreach($tb as $val){}
    }
    function avecRef(&$tb){
        foreach($tb as $val){}
    }
     
    $b->benchDebut('sansRef');
    for($i = 0; $i < 10000; $i++) sansRef($tb);
    $b->benchFin('sansRef');
     
     
    $b->benchDebut('avecRef');
    for($i = 0; $i < 10000; $i++) avecRef($tb);
    $b->benchFin('avecRef');

    ce qui génère ceci :
    sansRef -> 1,4837 Seconde
    avecRef -> 0,6329 Seconde
    Le plus grand arbre est né d'une graine menue, une tour de neuf étages est partie d'une poignée de terre.
    Mon blog : http://web.codeur.free.fr

Discussions similaires

  1. Ne pas rafraichir les images avec PHP
    Par tornaod dans le forum Langage
    Réponses: 4
    Dernier message: 07/12/2005, 22h44
  2. Pb avec les références d'une base de données
    Par Celia1303 dans le forum Access
    Réponses: 8
    Dernier message: 01/12/2005, 15h44
  3. php:comment utiliser les sessions en php
    Par feten dans le forum Langage
    Réponses: 3
    Dernier message: 19/11/2005, 16h17
  4. Réponses: 6
    Dernier message: 28/09/2004, 16h47
  5. Réponses: 3
    Dernier message: 23/08/2004, 17h49

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