2011-01-24 4 views
10

EDIT :: oh j'oubliéLa méthode statique est-elle plus rapide que non statique?

class Test1{ 
    public static function test(){ 
     for($i=0; $i<=1000; $i++) 
      $j += $i;  
    } 
} 

class Test2{ 
    public function test() { 
     for ($i=0; $i<=1000; $i++){ 
      $j += $i; 
     } 
    } 

} 

pour cet algorithme

$time_start = microtime(); 
$test1 = new Test2(); 
for($i=0; $i<=100;$i++) 
    $test1->test(); 
$time_end = microtime(); 

$time1 = $time_end - $time_start; 

$time_start = microtime(); 
for($i=0; $i<=100;$i++) 
    Test1::test(); 
$time_end = microtime();  

$time2 = $time_end - $time_start; 
$time = $time1 - $time2; 
echo "Difference: $time"; 

i ont des résultats

Difference: 0.007561 

et ces jours-ci, je suis en train de faire mes méthodes statiques que possible. Mais est-ce vraiment vrai, .. au moins pour php

+10

La question que vous devriez vous poser: La différence de vitesse vous cause-t-elle des problèmes? Si non, ne vous inquiétez pas à ce sujet. –

+1

ne sait pas .. mais si les méthodes statiques sont faciles à appeler et je l'utilise beaucoup. J'ai eu une présomption que la méthode statique serait lente que régulière, mais mes résultats montrent statique sont plus rapides. Je voulais juste confirmer (pour les connaissances disons) –

+2

Complete idem. Commencez par le faire fonctionner. Il ressort clairement de votre test simple que ce n'est probablement pas une différence d'ordre de grandeur significative, alors concentrez-vous sur les fonctionnalités et vous inquiétez des optimisations de niveau milliseconde si elles deviennent populaires. Cependant, au moment où vous arrivez à ce niveau, vous avez probablement re-factorisé le tout plusieurs fois ... – Hamy

Répondre

31

Vous devez toujours utiliser statique lorsque vous n'avez pas besoin d'un objet autour de votre méthode, et utiliser dynamique lorsque vous avez besoin d'un objet. Dans l'exemple fourni, vous n'avez pas besoin d'objet, car la méthode n'interagit pas avec les propriétés ou les champs de votre classe.

Celui-ci doit être statique, car il n'a pas besoin d'un objet:

class Person { 
    public static function GetPersonByID($id) { 
     //run SQL query here 
     $res = new Person(); 
     $res->name = $sql["name"]; 
     //fill in the object 
     return $res; 
    } 
} 

Celui-ci doit être dynamique, car il utilise l'objet est en:

class Person { 
    public $Name; 
    public $Age; 
    public function HaveBirthday() { 
     $Age++; 
    } 
} 

La vitesse La diffirence est minime, mais vous devez créer un objet pour exécuter des méthodes dynamiques, et cet objet est sauvegardé en mémoire, donc les méthodes dynamiques utilisent plus de mémoire et un peu plus de temps.

+2

Bien que ce soit la réponse correcte du manuel, [les méthodes statiques sont la mort à la testabilité] (http://misko.hevery.com/2008/12/15/static-methods-are-death-to-testability) et doivent être évitées . – Gordon

+0

Vous êtes sûr que le son est logique mais +1 votez pour accepter –

17

Réponse courte puisque je ne veux pas aller dans une diatribe à beaucoup:

Peu importe si elle est plus rapide. Si vous avez besoin de quelque chose où la performance est si importante que vous pensez à raser de 0,02 nanosecondes par appel de fonction que vous ne le ferez pas en PHP de toute façon.

Les méthodes statiques font du code "tout global" untestable, non-supportable, qui va vous faire beaucoup plus mal qu'autre chose.

Si vous ne voulez pas utiliser la bonne POO (et c'est tout à fait correct si vous savez quoi et pourquoi vous le faites) alors s'il vous plaît faites-le. Juste ne le faites pas parce que vous voulez économiser le temps de cpu.

http://misko.hevery.com/2008/12/15/static-methods-are-death-to-testability/

http://sebastian-bergmann.de/archives/885-Stubbing-Hard-Coded-Dependencies.html

http://en.wikipedia.org/wiki/Class-based_programming

Si vous ne cliquez sur un lien:http://www.scribd.com/doc/20893084/Advanced-OOP-and-Design-Patterns#scribd

Premature optimization is the root of all evil. Code de construction qui est facile à entretenir et si elle devient prendre lentement un profil et il vous dira probablement que le système de fichiers ou la base de données est un problème, celui que vous avez tout ce qui a trié il y aura quelques morceaux très spécifiques de PHP pour optimiser. Si vous avez du code propre et modifiable, vous pouvez les accélérer.

+0

Je pense que Stefan doit avoir retiré son slideshare mais il semble que quelqu'un d'autre a mis une copie ici, semble être une bonne lecture ... http: // www. scribd.com/doc/20893084/Advanced-OOP-and-Design-Patterns – Carlton

+0

"Les méthodes statiques font du" tout "un code qui ne peut pas être testé, ne peut pas être maintenu et qui va vous faire beaucoup plus mal qu'autre chose.". Je suis en désaccord complètement. C'est même plus facile de tester une méthode statique que non statique. Classe: method() est plus facile que $ obj = new Classe(); $ obj-> method(). – magallanes

0

Si vous avez l'intention de faire vos méthodes statiques et ajouter un paramètre pour passer vos objets de classe dans, qui est en fait plus lent. J'ai comparé un test avec ceci et c'est une perte considérable. Faire circuler des objets à travers différentes méthodes statiques est une perte de performance. Il vaut mieux les garder dynamiques, dans l'objet.

Je suis assez certain que la performance est plus rapide avec les méthodes dynamiques parce que les appels sont faits dans le même objet. En utilisant des méthodes statiques dans les objets, il y a un saut supplémentaire par appel, car l'appel n'est pas fait dans l'objet, mais dans la classe.

Réduit l'utilisation de la mémoire pour utiliser des méthodes statiques. Si vous pouvez héberger vos méthodes dans la classe, les objets seront plus légers sans eux. Mais le plus important dans mes tests est l'accessibilité. L'accès direct aux méthodes est le plus rapide, tandis que l'accès aux méthodes de classe statiques est un saut supplémentaire. C'est vraiment une question de traitement par rapport à la mémoire. Neuf fois sur dix, la dynamique est plus rapide.

3

"L'optimisation prématurée est la racine de tous les maux" a été dit il ya 40 ans par Donald Knuth. Vous savez, à l'époque où vous avez eu le nouveau microprocesseur 4004 qu'Intel a inventé. Ce tambour est battu aussi fort que n'importe quel cheval peut être et je ne vois pas comment cela se rapporte à la question originale. En fait, j'ai peut-être eu de la chance, mais je n'ai pas vu de preuve de ce comportement rampant sur le terrain. Hélas, quelqu'un sur Internet doit avoir raison avant que nous puissions tous rentrer pour la nuit.

Plus sur le sujet, je pense que la réponse acceptée est la plus pragmatique et le premier commentaire à la question est la bonne à poser. Que le code statique soit instancié est plus rapide dépend principalement de la façon dont le langage est implémenté et je ne vois pas que l'une de ces réponses répond suffisamment à la question en ce qui concerne PHP. Quelqu'un sait PHP et veut peser?

Questions connexes