74 votes

En PHP (> = 5.0), le passage par référence est-il plus rapide?

En PHP, la fonction des paramètres peuvent être passés par référence en ajoutant le signe du paramètre dans la déclaration de la fonction, comme ceci:

function foo(&$bar)
{
    // ...
}

Maintenant, je suis conscient que c'est pas conçue pour améliorer les performances, mais également de permettre à des fonctions de modifier les variables qui sont normalement hors de leur portée.

Au lieu de cela, PHP semble utiliser la Copie Sur Écriture pour éviter la copie d'objets (et peut-être aussi des tableaux) jusqu'à ce qu'ils soient modifiés. Donc, pour les fonctions qui ne changent pas leurs paramètres, l'effet doit être le même que si vous aviez passé par référence.

Cependant, je me demandais si la Copie de la logique d'Écriture est peut-être shortcircuited sur le laisser-passer-par-référence de et si qui n'a aucun impact sur les performances.

ETA: Pour être sûr, je suppose que ce n'est pas plus rapide, et je suis bien conscient que ce n'est pas ce que les références sont pour. Donc, je pense que mes propres suppositions sont très bonnes, je suis à la recherche d'une réponse de quelqu'un qui sait vraiment ce qui est certainement qui passe sous le capot. En cinq ans de développement en PHP, j'ai toujours trouvé qu'il est difficile d'obtenir des informations de qualité sur PHP internals court à partir de la lecture de la source.

90voto

ikary Points 401

Dans un essai de 100 000 itérations de l'appel d'une fonction avec une chaîne de 20 ko, les résultats sont les suivants:

Fonction qui lit / utilise le paramètre

pass by value:      0.12065005 seconds
pass by reference:  1.52171397 seconds

La fonction écrire / modifier le paramètre

pass by value:      1.52223396 seconds
pass by reference:  1.52388787 seconds

Conclusions

  1. Passez le paramètre par valeur est toujours plus rapide

  2. Si la fonction de changement de la valeur de la variable passée, pour des raisons pratiques, est le même que le passage par référence plutôt que par valeur

37voto

Paul Dixon Points 122033

Le Zend Engine utilise copy-on-write, et lorsque vous utilisez une référence vous-même, il engage un peu plus de frais généraux. Ne peut trouver cette mention au moment de l'écriture, cependant, et les commentaires dans le manuel contient d'autres liens.

(EDIT) La page de manuel sur les Objets et les références contient un peu plus d'infos sur la façon dont les variables d'objet diffèrent de références.

30voto

Petah Points 18432

J'ai couru quelques tests sur ce parce que je n'étais pas certain de la réponse donnée.

Mes résultats montrent que le passage de grands tableaux ou des chaînes par référence EST nettement plus rapide.

Voici mes résultats: Benchmark

L'axe des Y (Pistes) est combien de fois une fonction peut être appelée en 1 seconde * 10

Le test a été répété 8 fois pour chaque fonction/variable

Et voici les variables que j'ai utilisé:

$large_array = array_fill(PHP_INT_MAX / 2, 1000, 'a');
$small_array = array('this', 'is', 'a', 'small', 'array');
$large_object = (object)$large_array;
$large_string = str_repeat('a', 100000);
$small_string = 'this is a small string';
$value = PHP_INT_MAX / 2;

Ce sont les fonctions:

function pass_by_ref(&$var) {
}

function pass_by_val($var) {
}

7voto

Vladimir Fesko Points 142

J'ai expérimenté avec des valeurs et des références de 10k octets chaîne passant à deux fonction identique. On prend argument par valeur et le second par référence. Ils ont des fonctions communes - prendre argument, faire un traitement simple et renvoyer une valeur. J'ai fait 100 000 appels à la fois compris que les références ne sont pas conçues pour augmenter les performances lucratif de référence a été de près de 4 à 5% et il ne se développe que lorsque la chaîne devient suffisamment grand (100k et plus longue, ce qui a donné 6-7% d'amélioration). Donc, ma conclusion est de ne pas utiliser des références pour augmenter la performance, ce genre de choses n'est pas pour que.

J'ai utilisé la Version de PHP 5.3.1

3voto

Greg Points 132247

Je suis à peu près sûr que non, ce n'est pas plus rapide. De plus, il est spécifiquement indiqué dans le manuel de ne pas essayer d'utiliser des références pour améliorer les performances.

Edit: Vous ne pouvez pas trouver où il est dit que, mais c'est là!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X