A menudo cuando un desarrollador comienza a programar en Php, se siente que ha encontrado la herramienta perfecta para el rápido desarrollo de sitios webs dinámicos, incluso tiempo atras en el que que las características del lenguaje y la cantidad de funciones eran más escasas.
De un tiempo a esta parte el lenguaje a añadido extensiones y una gran popularidad. Desafortunadamente esto hace que para nuevos programadores sea mas dificil comprender algunos conceptos de este lenguaje y cometer numerosos errores de optimización, muchos de ellos son muy obvios pero no por ello dejan de ser importantes por la cantidad de veces en los que podemos incurrir dentro de un mismo script.
Veamos algunos de los más comunes y la explicación de porqué realentizan la ejecución de nuestro script.
| Código lento (No recomendado) | Código rápìdo (Recomendado) | Explicación |
| $i++; | ++$i; | Ninguna razón |
| $i += 1; | ++$i; | Ninguna razón |
| rand($min,$max); | mt_rand($min,$max); | mt_rand es matemáticamente más veloz |
| $i = 0; while($array[$i]){ ++$i; } |
$i = 0; $count = count($array); while($i < $count){ ++$i; } |
Probar si un array existe es más lento que probar que una variable es menor que otra |
| print 'algo'; | echo 'algo'; | echo no devuelve nada por el contrario print si lo hace |
| ob_start(); echo 'algo'; ob_end_flush(); |
ob_start(); print 'algo'; ob_end_flush(); |
echo no devuelve nada, print si lo hace y por lo tanto haciendo el echo se debe de evaluar dos veces |
| echo 'algo (HTML, con etiquetas php)'; | algo (HTML, con etiquetas php) | Php es más lento que la salida directa en HTML |
| include('output/contain_no_php'); | readfile('output/contain_no_php'); | readfile devuelve directamente la salida de un fichero por el contrario include debe de evaluarlo por dos veces |
| echo "$variable cadena "; | echo $variable.'cadena'; | Las comillas simples no evaluan el contenido sin embargo las dobles comillas si lo hacen por lo que realentiza la ejecución del script |
| UNA_CONSTANTE; | $una_variable; | Ninguna razón |
| constant('UNA_CONSTANTE'); | UNA_CONSTANTE; | Ninguna razón |
| pi(); | M_PI; | Php crea una constante más rápido que el tiempo que tarda en calcular una función matemática, aplicar a todas aquellas constantes matemáticas existentes en Php |
|
if($numero<0){
$numero *= -1; } |
abs($numero); | Siempre utilizar una función existente en Php antes de crearla por nosotros mismos |
| pow($x , $exp) + pow($x , $exp - 1); $a*$b+$a*$c+$a*$d; |
($x + 1) * pow($x , $exp - 1); $a*($b+$c+$d); |
Las operaciones en formato expandido son habitualmente más lentas |
|
if($a == $b)
|
if($a === $b) |
La triple = no necesita convertir los tipos de datos |
| pow($x, 0.5); | sqrt($x); | Ninguna razón |
| 1/2; |
0.5; |
Php realiza la división entre 1 y 2 mientras por el contrario el segundo caso es directamente el resultado y no necesita ser procesado |
| if($a == 30); | if(30 == $a); | El segundo caso nos devolverá un error en caso de que hayamos cometido un error tipográfico del tipo '=' en vez de '==' , por lo tanto es mejor esta opción ya que podremos encontrar el error fácilmente |
Enlaces Relacionados
Generar passwords accesibles con Php
Codigo Fuente del generador de passwords en PHP
Ejemplo de ejecución del script
PHP y MySql una estrecha relación
5 cosas que no sabías hacer con PHP
Generar documentos OpenOffice con PHP
Nueva versión de Notepad++
Hola Mundo!
Identificar las consultas más lentas de MySql
Crea sencillas gráficas con MySql
Programar un script PHP para saber quién está en línea
Consejos para optimizar PHP
Editando en Opera páginas web en tiempo real





David - Agiliza tus scripts Php
Mira que artíulo mas chulo
http://www.tufuncion.com/optimizar-script-php
Buen artículo
He llegado aquí a traves de la lista de php-es, donde se trataba í©ste tema últimamente.
Me ha gustado el artículo por algunas curiosidades como la constante de PI o la diferí©ncia entre echo o print cuando se guarda la salida en buffer.
Iba a hacer las mismas aclaraciones que en el comentario anterior, pero hay otro caso, include no es lo mismo que readfile.
Readfile produce la salida directa al navegador. Por lo tanto solo debe usarse en includes que contengan únicamente HTML. En caso de contener PHP, se enviará el código PHP al usuario en vez de interpretarlo.
NO FUNCIONA:
readfile("conec.php"); // donde conec realiza la conexion enlazada con $link
$res = mysql_query("SELECT * FROM usuaris LIMIT 1",$link) or die(mysql_error($link));
ES CORRECTO:
include("conec.php");
$res = mysql_query("SELECT * FROM usuaris LIMIT 1",$link) or die(mysql_error($link));
Un saludo,
Pere Picornell
Algunos apuntes
Muy buen artículo. Algunas cosas no las sabía, pero otras tengo que aclarar algo:
$i++ no es lo mismo que ++$i ya que $i++ muestra el valor de $i y luego lo aumenta, mientras que ++$i es al reví©s.
Salir de PHP para producir una salida en HTML queda estí©ticamente peor y visiblemente más difícil de comprender, al menos yo y mucha gente que conozco lo ve así.
El == convierte tipos y el triple === no, pero resulta que if (30 == "30") daría true y if (30==="30") daria false, cuando todos sabemos que tanto una como otra son verdad.
Así que hay que aclarar lo siguiente:
1. Usar ++$i en lugar de $i++ cuando únicamente queramos aumentar la variable en 1 sin usarla en salida por pantalla.
2. Procurar separar el código HTML del PHP sin hacer cambios de PHP y HTML, ya que queda antiestí©tico y luego te va a resultar a ti y a cualquiera muy difícil la lectura.
3. Usar === en lugar de == cuando sepamos a ciencia cierta que: a)Queremos comprobación tanto de valor como de tipos; b) Sepamos que el ambos tipos van a ser iguales siempre.
Por lo demás, muy bueno, me lo apunto ;)
Rebate
En el primer comentario dice:
" El == convierte tipos y el triple === no, pero resulta que if (30 == "30") daría true y if (30==="30") daria false, cuando todos sabemos que tanto una como otra son verdad. "
Creo que diciento en esto: 30 no es igual a "30". En cuestión de valor puede ser, pero son dos tipos distintos de datos. El primero es número y el segundo es un string, por ende son distintos.
Se supone que dos datos son iguales si sus valores son iguales, y sus entre su valor tenemos implícito el tipo de dato, si una cadena, si es número, si es valor lógico, etc.
También no estoy de acuerdo (aunque esto ya es una cuestión de gustos), en la forma de programar.
Yo prefieron esto:
if (true)
{
?>
Esto es mi salida
?>
}
a esto:
if (true)
{
echo "
Esto es mi salida
";
echo "
echo "
echo "
";
echo "
";
echo "
";
?>
}
La primera forma, con salidas a HTML es a mi criterio y para mi gusto, mucho más simple de leer y mucho más fácil de mantener.
Enviar un comentario nuevo