2011-01-24 37 views
10

EDITAR :: Ah se me olvidó¿El método estático es más rápido que el no estático?

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; 
     } 
    } 

} 

para este algoritmo

$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"; 

tengo resultados

Difference: 0.007561 

y en estos días, estoy tratando de hacer mis métodos estáticos como sea posible. Pero, ¿es realmente cierto? Al menos para php

+10

La pregunta que debe hacerse: ¿La diferencia de velocidad le causa algún problema? Si no, no te preocupes por eso. –

+1

no sé ... pero si los métodos estáticos son fáciles de llamar y lo uso mucho. Tuve la pre-suposición de que el método estático sería más lento que el habitual, pero mis resultados muestran que la estática es más rápida. solo quería confirmar (para conocimiento, digamos) –

+2

Completo ídem. Primero haz que funcione. De tu simple prueba queda bastante claro que probablemente no se trate de una diferencia de orden de magnitud significativa, así que concéntrate en las características y preocúpate por las optimizaciones de milisegundos si se vuelve popular. Sin embargo, para cuando llegue a ese nivel, probablemente haya vuelto a factorizarlo varias veces ... – Hamy

Respuesta

31

Siempre debe usar estática cuando no necesite un objeto alrededor de su método, y use dinámico cuando necesite un objeto. En el ejemplo que proporciona, no necesita un objeto, porque el método no interactúa con ninguna propiedad o campo de su clase.

Ésta debe ser estática, ya que no necesita un objeto:

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

Ésta debe ser dinámico, ya que utiliza el objeto se encuentra en:

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

La velocidad La diferencia es mínima, pero debe crear un objeto para ejecutar métodos dinámicos, y ese objeto se guarda en la memoria, por lo que los métodos dinámicos utilizan más memoria y un poco más de tiempo.

+2

Si bien esta es la respuesta correcta de los libros de texto, [los métodos estáticos son mortales para la capacidad de prueba] (http://misko.hevery.com/2008/12/15/static-methods-are-death-to-testability) y deben evitarse . – Gordon

+0

Seguro suena lógico pero +1 voto arriba acepta mañana –

17

Respuesta corta ya que no quiero ir a despotricar a mucho:

No importa si es más rápido. Si necesita algo donde el rendimiento ES TAN IMPORTANTE que piense en afeitarse de 0.02 nanosegundos por llamada de función, no lo hará en PHP de todos modos.

Los métodos estáticos crean un código "global global" incontestable e irreprimible que te hará mucho más daño que cualquier otra cosa.

Si no desea utilizar un OOP adecuado (y eso es totalmente correcto si sabe qué y por qué lo está haciendo), hágalo. Simplemente no lo haga porque quiere ahorrar tiempo 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 sólo clic en un enlace:http://www.scribd.com/doc/20893084/Advanced-OOP-and-Design-Patterns#scribd

código Premature optimization is the root of all evil. generación que es fácil de mantener y si se está haciendo lenta toma un perfil y lo más probable es que te diga que el sistema de archivos o la base de datos es un problema, uno que tiene todo lo solucionado habrá algunas piezas muy específicas de php para optimizar. Si tienes un código limpio y modificable, puedes acelerarlo.

+0

Creo que Stefan debe haber bajado su slideshare pero parece que alguien más ha puesto una copia aquí, parece una muy buena lectura ... http: // www. scribd.com/doc/20893084/Advanced-OOP-and-Design-Patterns – Carlton

+0

"los métodos estáticos hacen que el código no sea estable, no se pueda mantener, lo" global "lo lastime mucho más que cualquier otra cosa". No estoy de acuerdo por completo Es incluso más fácil probar un método estático que no es estático. Clase: método() es fácil que $ obj = new Class(); $ obj-> method(). – magallanes

0

Si tiene la intención de hacer que sus métodos sean estáticos y agregar un parámetro para pasar sus objetos de clase, eso es realmente más lento. Hice una prueba comparativa con esto y es una pérdida considerable. Pasar por los objetos a través de varios métodos estáticos es una pérdida de rendimiento. Es mejor mantenerlos dinámicos, en el objeto.

Estoy bastante seguro de que el rendimiento es más rápido con métodos dinámicos porque las llamadas se realizan en el mismo objeto. Al usar métodos estáticos en los objetos, hay un salto extra por llamada, ya que la llamada no se realiza dentro del objeto, sino en la clase.

Reduce el uso de memoria para usar métodos estáticos. Si puede albergar sus métodos en la clase, los objetos serán más ligeros sin ellos. Pero lo más importante en mis pruebas es la accesibilidad. El acceso directo a los métodos es más rápido, mientras que el acceso a los métodos de clase estáticos es un salto adicional. Es realmente una cuestión de procesamiento versus memoria. Nueve veces de cada diez, la dinámica es más rápida.

3

"La optimización prematura es la raíz de todos los males" se dijo hace 40 años por Donald Knuth. Ya sabes, cuando tenías el nuevo 4004 microprocesador que Intel inventó. Ese tambor es tan duro como cualquier caballo y no veo cómo se relaciona con la pregunta original. De hecho, pude haber tenido suerte, pero no he visto evidencia de este comportamiento rampante en el campo. Por desgracia, alguien en Internet tiene que estar en lo cierto antes de que todos podamos meternos en la noche.

Más sobre el tema, creo que la respuesta aceptada es la más pragmática y el primer comentario a la pregunta es el correcto para preguntar. El hecho de que el código estático frente a un código instanciado sea más rápido depende principalmente de la forma en que se implemente el lenguaje y no veo que ninguna de estas respuestas responda de manera suficiente la pregunta con respecto a PHP. ¿Alguien sabe PHP y quiere pesar?

Cuestiones relacionadas