2009-12-24 9 views
5

¿Cuáles son algunas de las operaciones más caras en PHP? Sé que cosas como usar demasiado el operador @ pueden ser costosas. ¿Qué más considerarías?¿Las operaciones más caras en PHP?

+5

¿por qué intentas atrapar estos pequeños problemas de rendimiento? si su programa es lento, no es debido a @ –

+4

El "PayPal $ 10 a Paul Tomblin" es bastante caro. Pero totalmente vale la pena. –

+0

@valya Estoy tratando de tener una idea de las diferentes cosas que deben evitarse en lo que se refiere al rendimiento. Solo uso el operador @ como ejemplo. –

Respuesta

18
  • serialize() es lento, como es eval(), create_function(), y el desove procesos adicionales a través del sistema() y las funciones relacionadas.
  • tenga cuidado con algo APC no puede almacenar en caché - conditional includes, eval() código de edición, etc.
  • Apertura de conexiones de base de datos. Siempre guarde en la memoria caché sus conexiones y vuelva a utilizarlas.
  • Clonación de objetos
  • Expresiones regulares. Utilice siempre las operaciones de cadena normales sobre una operación de expresión regular si no necesita la funcionalidad de una expresión regular, p. use str_replace() sobre preg_replace() donde sea posible.
  • de registro y escrituras en disco pueden ser lentos - eliminar la tala y archivos operaciones innecesarias

Algunos micro-optimizaciones que son buenas prácticas, pero no hará mucha diferencia en el rendimiento de resultados:

  • Usar echo es más rápido que imprimir
  • Concatenar variables es más rápido que usarlas en línea en una cadena de comillas dobles.
  • El uso del eco con una lista de argumentos es más rápido que concatenar los argumentos. Ejemplo: echo 'How are you ',$name,' I am fine ',$var1 es más rápido que echo 'How are you '.$name.' I am fine '.$var1
  • Desarrollar con avisos y advertencias activados. Asegurarse de que no se activen evita que PHP tenga que ejecutar el control de errores en ellos.
+2

Exactamente el tipo de respuesta que estoy buscando. Gracias @zombat !! –

+0

En mi experiencia, clonar un objeto es más barato que crear uno nuevo. –

2

Cualquier cosa que atraviese una conexión de red, como llamar a un servicio web, por ejemplo: en general, tomará más tiempo que realizar una operación localmente.

(Incluso si no cuesta mucho CPU, le va a costar tiempo)

0

foreach() declaraciones, especialmente con anidación, con frecuencia son caros; aunque ese es mi enfoque ingenuo, y ocasionalmente mal planificado, de programación como culpa de php.

Aunque creo que es cierto, también, de JS y otros idiomas, por lo que es casi seguro que es mi culpa. =/

+0

No es necesariamente el foreach en sí mismo el que es lento, sino la lógica dentro del foreach.La mejor práctica sería pasar los datos una sola vez, siempre que sea posible, y hacer el menor procesamiento posible dentro de un ciclo foreach, ya que ese ciclo se ejecutará 1-infinito veces, dependiendo del tamaño del conjunto que usted se están iterando –

4
"Hello $name" 

sintaxis es más lento que

'Hello ' . $name 

también __get() __set() __call(), etc, son lentos

y, si te importa tanto, se puede optimizar el uso structures de SPL

+1

+1, nunca supe que '" Hola $ nombre "' fue más lento que '" Hola ". $ name' =) –

+0

La interpolación de cadenas PHP no es lo que yo llamaría "una de las operaciones más caras en PHP". Es muy rápido. Sí, tiene razón: el ejemplo de interpolación anterior es 20% o 25% más lento en relación con el ejemplo de concatenación, pero eso no implica que la interpolación sea una gran resistencia. –

+0

tampoco hacer "@" o cualquier otra cosa. deja de temer a las características, teme a tu código malo –

1

I Diría consultas SQL dentro de los bucles. Como este:

foreach ($db->query('SELECT * FROM categories') as $cat) 
{ 
    foreach ($db->query('SELECT * FROM items WHERE cat_id = ' . $cat['cat_id']) as $item) 
    { 
    } 
} 

Lo cual, para el registro, podría acortarse en algo como esto:

$sql = 'SELECT c.*, i.* 
      FROM categoriess c 
    LEFT JOIN items i USING (cat_id) 
     ORDER BY c.cat_order'; 

foreach ($db->query($sql) as $row) 
{ 
} 
+4

No es un cuello de botella de PHP –

+0

Creo que el segundo ejemplo sería ligeramente/más/costoso ya que hay una instrucción de asignación. –

+1

¿Ah sí? ¿Así que qué es lo? La pregunta es "¿cuál es el material más caro en PHP?" Y la respuesta es "cualquier cosa que pongas dentro de un bucle que no pertenezca allí". Pero tienes razón, ¡es mucho más importante ocuparte de esas molestas comillas simples! –

5

En lugar de tratar de averiguar las posibles áreas que son lentos, utilizan una herramienta de perfilado. Instalar xDebug fue probablemente una de las cosas más fáciles y mejores que he hecho para mejorar el código que escribo. Instale con WinCacheGrind (o la versión correcta para su sistema operativo) para obtener mejores resultados.

+0

de acuerdo. Solo estoy pensando en cosas que uno podría querer comprometer con la memoria muscular para evitarlas automáticamente. En mi opinión, perfilar es lo mejor para mostrarte los cuellos de botella que de otra manera no conocías. –

+0

Sí, gran punto. Si utiliza un marco, tenderá a descubrir que la mayor parte del tiempo se utiliza en ese marco, y a menudo, no es un lugar que realmente pueda optimizar. Algo como APC puede hacer maravillas (o cualquier caché de código de operación para el caso). Además, WinCacheGrind es bastante antiguo, revise kCacheGrind para Ubuntu (ejecuté una máquina virtual solo para esta herramienta). –

0

Según mi propia experiencia, la operación más cara en términos reales es la declaración echo. Intenta unir todas las cadenas antes de enviarlas al navegador, seguido de llamadas a la base de datos, ¡especialmente uniones!

El código también a veces puede obtener un aumento de rendimiento x10 simplemente refacturando sus algoritmos y estructuras de datos. Consigue cualquier programa y prueba la mitad de su longitud, ¿puedes volver a la mitad?

+0

¿Quiere decir asignar todo lo que va a hacer eco a una variable y luego repetir esa variable cuando esté listo? –

+0

Piense en ello como esto Darrell: echo "texto1" echo "texto2" echo "text3" es lento que echo "texto1 + texto2 + text3" También es cierto en lenguajes como Java y C# en donde usted saca un montón de declaraciones a la consola. – Woot4Moo

1

curl_exec() es muy lento, en comparación con las operaciones típicas. Además, la mayoría de las operaciones str_ * son más rápidas que las operaciones regex.

1
  • json_encode es más rápido que serializar
  • Concatenate en bucle es más rápido que implosionan

@ La gente piensa que es caro tal vez sólo porque esta palabra es bastante amplia difusión en la web.

citar: http://www.php.net/manual/en/language.operators.errorcontrol.php#102543

Si usted se está preguntando lo que el impacto en el rendimiento del uso de la @ operador es, considere este ejemplo. Aquí, la segunda secuencia de comandos (usando el operador @) tarda 1.75x en ejecutarse ... casi el doble del tiempo del primer script.

Por lo tanto, mientras que sí, hay una sobrecarga, por iteración, vemos que el operador @ agregó solo .005 ms por llamada. No es razón suficiente, imho, para evitar el uso del operador @. sys

reales 0m7.617s 0m6.788s usuario sys 0m0.792s

vs

de usuarios reales 0m13.333s 0m12.437s 0m0.836s

Usted puede casi no puede "abusar" de un operador y a menudo vale la pena si está haciendo una operación que desea.

0

uniqid() es estúpido costoso. No lo use para generar muchos identificadores únicos.

Cuestiones relacionadas