6
votes

Que fait l'opérateur d'attribution PHP?

J'arrive à lire ce http://code.google.com/speed /Articles/Optimizizizizizing-PHP.HTML

Il affirme que ce code xxx

doit être optimisé comme ci-dessous xxx

Cependant, dans ma compréhension, l'opération d'affectation dans PHP ne crée pas nécessairement une copie en mémoire.

Ceci n'a qu'une copie de "ABC" en mémoire. xxx

Il consomme plus de mémoire lorsque une variable est modifiée. < Pré> xxx

est-ce correct?


1 commentaires

Dans votre premier morceau de code, vous ne pouvez pas référencer $ Description plus tard sur? Est-ce que cela implique que la chaîne est stockée en mémoire? Le deuxième morceau, cependant, ne peut plus être référencé. Vous devez réévaluer la fonction une fois de plus pour obtenir la même sortie.


3 Réponses :


5
votes

devrait être optimisé comme ci-dessous

Ce n'est qu'une bonne idée si vous n'avez pas besoin de le stocker, évitant ainsi la consommation de mémoire inutile. Cependant, si vous devez émettre la même chose plus tard, il est préférable de le stocker dans une variable pour éviter un autre appel de fonction.

est-ce correct?

oui. Ça s'appelle Copy-on-Write.


3 commentaires

At-il vraiment "consommation de mémoire inutile"? Je veux dire, si $ _Post ['Description'] est 512K, le premier code de bloc consomme-t-il une double mémoire? Je suppose que cela prend la même mémoire, mais la mémoire ne serait pas publiée avant la fin du script.


@Morgan Cheng: $ _ Post ['Description'] et $ Description est différent, car $ Description est une copie de $ € ['Description'] auquel vous avez appliqué une modification ( strip_tags ). Donc, oui, cela prend plus de mémoire que de faire référence à la variable post-poste. En outre, la mémoire n'est pas nécessairement libérée à la fin du script, elle est libérée lorsque la variable est hors de portée.


@NetCoder La mémoire est doublée de toute façon, car les données modifiées doivent être stockées quelque part, aussi brefs. La seule différence est que directement echo la valeur de retour de fonction permet de récupérer immédiatement la mémoire, car aucune référence n'existe plus.



1
votes

Dans le premier exemple, si la variable n'est utilisée qu'une fois, il n'ya pas de point de faire une variable en premier lieu, il suffit d'echo les déclarations le résultat immédiatement, il n'est pas nécessaire de la variable.

Dans le deuxième exemple, PHP a quelque chose appelé copie sur l'écriture. Cela signifie que si vous avez deux variables qui indiquent la même chose, elles sont toutes deux pointant sur le même peu de mémoire. C'est jusqu'à ce que l'une des variables soit écrite, une copie est effectuée et la modification est apportée à cette copie.


0 commentaires

1
votes

L'auteur a un point dans la mesure où la copie des données dans une variable sera garder ces données en mémoire jusqu'à ce que la variable soit non définie . Si vous n'avez pas besoin des données plus tard, il est en effet gaspillé la mémoire.

Sinon, il n'y a pas de différence dans la consommation de mémoire entre les deux méthodes, de sorte que son raisonnement ("copie") est faux.


2 commentaires

Eh bien, les variables seront inchangées automatiquement lorsqu'elles sortent de la portée. Ce que vous mentionnez est vrai dans la programmation procédurale, mais pas vraiment une préoccupation dans une application OO correctement structurée.


@NetCoder accordé, bien sûr. Mais si vous allez générer beaucoup plus de données dans la même portée, cela peut faire la différence entre un script d'exécution et un script de terminaison. :)