67 votes

Les performances des méthodes statiques vs fonctions

En PHP, (contrairement à ce que je pensais au début) il y a une surcharge de l'appel de méthodes statiques vs les fonctions simples.

Sur un simple banc, cette charge est de plus de 30% du temps d'appel (la méthode retourne le paramètre):

// bench static method
$starttime = microtime(true);
for ($i = 0; $i< 10*1000*1000; $i++)
	SomeClass::doTest($i);

echo "Static Time:   " , (microtime(true)-$starttime) , " ms\n";

// bench object method
$starttime = microtime(true);

for ($i = 0; $i< 10*1000*1000; $i++)
	$someObj->doTest($i);

echo "Object Time:   " , (microtime(true)-$starttime) , " ms\n";

// bench function
$starttime = microtime(true);

for ($i = 0; $i< 10*1000*1000; $i++)
	something_doTest($i);

echo "Function Time: " , (microtime(true)-$starttime) , " ms\n";

sorties:

Static Time:   0.640204906464 ms
Object Time:   0.48961687088 ms
Function Time: 0.438289880753 ms

Je sais que le temps réel est encore négligeable, à moins que je me suis fait appel à quelque chose de 1 million de fois, mais le fait est qu'il est là.

Quelqu'un soin pour essayer d'expliquer ce qui se passe derrière les coulisses?

mise à jour:
ajoutée, méthode de l'objet de banc

23voto

Greg Points 171

Il y a une grosse pénalité lors de l'appel d'une méthode statique, mais c'est corrigé dans 5.4.0 - voir l'étendue des résultats de test http://www.micro-optimization.com/global-function-vs-static-method .

9voto

Marco Demaio Points 8667

J'ai refait le test sur ma machine plusieurs fois, et étonnamment, vous avez raison!

En PHP, les méthodes d'appel d' static de la classe semble être plus lent que d'appeler des méthodes d'objet. Cliquez ici pour test simple.

Le code avec le test en cours est dans le lien ci-dessus.

J'ai même essayé de placer la fois l'objet et méthode de la méthode statique dans la même classe et l' static méthode encore des résultats plus LENT!!!

À ce stade, je me demande comment lent pourrait être un appel à un static méthode d'une classe héritée, depuis l'héritage ajoute retard.

Malheureusement, je suis paumé sur la raison. Peut-être que PHP prend plus de temps dans la recherche de la définition de l' static méthode.

Comme une note de côté, je pouvais seulement dire que dans la vie réelle de l'application, il arrive souvent d'avoir l'objet créé avant d'appeler une de ses méthodes. À cet effet votre test doit prendre cela en compte en comparant la boucle de la statique des appels à une boucle à chaque fois (ou au moins quelques fois) [*] crée l'objet:

for($i=0; $i<10*1000*1000; $i++)
{ 
   $someObj = new someObj();
   $someObj->doTest($i); 
}

ainsi est évidemment plus lent que l' static appel.

for($i=0; $i<10*1000*1000; $i++)
{ 
   SomeClass::doTest($i);
}

[*] le problème est la suivante: quelle est , à certains moments, afin de simuler ce happnes dans un monde réel de l'app? C'est difficile à dire!

5voto

Jquest Points 41

Il ya quelque chose de Mal dans vos tests. Avec un site web conçu pour fonctionner avec plusieurs utilisateurs en même temps, vous devez créer un objet pour chacun d'eux. Exécuter la méthode de l'objet dans vos tests, vous devriez avoir:

for($i=0; $i<10*1000*1000; $i++)
{ 
   $someObj = new someObj();
   $someObj->doTest($i); 
}

Si votre objet a plusieurs propriétés et méthodes, puis la création, il est plus lent et PHP utilise plus de mémoire. Une méthode statique n'aurez pas ce problème, et par conséquent l'utilisation de méthodes statiques est un meilleur choix dans beaucoup de situations. Par exemple, une classe avec des outils utiles avec des méthodes statiques pour les tâches courantes.

3voto

Brian Lyttle Points 9344

Il a été un moment depuis que j'ai fait du PHP, mais c'est probablement similaire à ce que vous attendez dans d'autres environnements de programmation.

Il est probable que la méthode statique nécessite certains travaux de construction d'un SomeClass objet derrière les scènes à chaque fois qu'il est appelé, alors que la fonction peut seulement être exécuté sans aucun coût de démarrage. La création d'un objet peut être coûteux en fonction d'un certain nombre de choses: la destruction des objets existants par un garbage collector/compteur de référence, de la mémoire de la pression provoquant la fragmentation, de la sous-optimale d'allocation de mémoire les politiques dans le runtime C etc.

Il serait intéressant de comparer la performance de la méthode d'un objet existant. Pour ce faire, créez une instance de SomeClass et puis d'appeler une méthode d'une instance à plusieurs reprises.

2voto

Nicolas Points 1596

Dans le cas de la méthode statique, PHP pour vérifier si la méthode peut ou ne peut pas être appelée à partir de l'appel le contexte (public, protected, private). Qui est plus susceptible quelles sont les causes de la surcharge, ou au moins une partie de celui-ci, le classique appel de fonction ne nécessite pas de PHP pour effectuer ce genre de contrôle.

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