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 :

Passage par référence caché


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 159
    Points : 91
    Points
    91
    Par défaut Passage par référence caché
    Bonjour à tous,

    En faisant un benchmark perso pour tester les performances entre un passage par copie et un passage par référence en PHP, je me suis trouvé face à une bizarrerie intéressante.

    Ma configuration actuelle est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PHP Version	5.3.9-ZS5.6.0
    Zend Framework Version	 1.11.11
    J'ai fais un premier test de cette forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $tab1 = array_fill(0, 1000000, 'e');
     
    $time_start = microtime(true);
    $tab2 = $tab1;
    $time_end = microtime(true);
     
    $time = $time_end - $time_start;
     
    echo 'Durée : '.$time.' secondes<br/>';
    Et à ma grande surprise, j'ai obtenu :
    Durée : 5.0067901611328E-6 secondes
    quand la création du premier tableau prenait :
    Durée : 0.14926791191101 secondes
    C'était comme si par défaut $tab2 était une référence de $tab1.
    Alors j'ai décidé de modifier $tab1 et de regarder $tab2 pour voir si il était modifié également.

    Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $tab1 = array_fill(0, 1000000, 'e');
     
    $time_start = microtime(true);
     
    $tab2 = $tab1;
    $tab1[14] = 'j';
     
    $time_end = microtime(true);
    $time = $time_end - $time_start;
    echo 'Durée : '.$time.' secondes<br/>';
    echo $tab2[14];
    Et là, résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Durée : 0.093044996261597 secondes
    e
    En commentant la ligne $tab1[14] = 'j';, je reviens à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Durée : 2.1457672119141E-6 secondes
    C'est une optimisation cachée, que je trouve intéressante. J'aimerais savoir si c'est un mécanisme connu, défini par le langage, ou un mécanisme lié au moteur PHP de Zend ?

    Si je comprend bien, une affection d'un tableau est faite par référence tant que les deux tableaux restent constants ?

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 690
    Points : 20 211
    Points
    20 211
    Par défaut
    Tant que 2 variables font référence à la même chose , PHP ne créer effectivement pas de copie du contenu.

    Tu peux avoir le détail de tout celà sur le très bon article de Julien Pauli : Maîtrise de la gestion des variables en PHP
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 159
    Points : 91
    Points
    91
    Par défaut
    Merci grunk,

    je vais lire cet article en détail.

Discussions similaires

  1. Passage par référence
    Par e1lauren dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 01/09/2006, 13h59
  2. Passage par copie vs passage par référence
    Par bolhrak dans le forum C++
    Réponses: 11
    Dernier message: 21/08/2006, 00h37
  3. Réponses: 4
    Dernier message: 26/12/2005, 18h01
  4. Passage par référence
    Par difficiledetrouver1pseudo dans le forum Langage
    Réponses: 9
    Dernier message: 28/09/2005, 12h17
  5. Problème très rapide de passage par référence
    Par Noxexplorer dans le forum ASP
    Réponses: 2
    Dernier message: 23/06/2005, 11h02

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