Técnicas de optimización de código

Por el 18 de mayo de 2007

en: Programacion

Estos pequeños consejos para optimizar el código de tu aplicación no son los únicos y probablemente los habrá mejores pero sin duda te pueden servir de gran ayuda si estas buscando optimizar partes de código de una aplicación, algunas de ellas son unicamente aplicables a un lenguaje en concreto pero con un poco de ingenio las podrás extrapolar a cualquiere lenguaje.

Aclarar que la optimización de código puede realizarse durante la generación o como paso adicional a esta y en último caso (menos recomendable) a posteriori.

Las optimizaciones de código en realidad proporcionan mejoras, pero obviamente no aseguran el éxito de una aplicación.

Clasificación de optimizaciones:

1. Dependientes de la máquina.
* Asignación de registros.
* Instrucciones especiales (“idioms”).
* Reordenación del código.
2. Independientes de la máquina.
* Ejecución en tiempo de compilación.
* Eliminación de redundancias.
* Cambio de orden.
* Reducción de frecuencia de ejecución (invariancias).
* Reducción de fuerza.

Tras esta breve introducción pasemos a ver cuales son las más técnicas más destacadas:

Elimina código innecesario

Si tienes código innecesario elimínalo, parece obvio pero en muchas ocasiones esos pequeños trozos de código se mantienen en todas las versiones de la aplicación, si tienes que reescribir una función pero no estas del todo seguro y por lo tanto no quieres perder la versión original, haz una copia de seguridad y de ese modo no se vera realentizada la ejecución de la aplicación.

Saca código de los bucles

Es probablemente una de los errores que puede consumir más CPU, por supuesto sé más cuidadoso con aquellos bucles que tengan mas iteraciones (Iteración significa repetir un proceso varias veces), con lo de sacar código no se trata de modificar la función final del bucle sino de optimizar al máximo su rendimiento, con esto queremos decir no incluir la declaración de una variable, no incluir comentarios, etc …

Pasar objetos por referencia mejor que por valor

Para aquellos que no sepais ¿Qué es pasar un valor por referencia? es mejor explicarlo con un ejemplo:

function valores_por_referencia (&$var)
{
$var++;
}

$a=5;
valores_por_referencia ($a);
// $a será 6 aqui

Cómo se puede deducir en el ejemplo al pasar un objeto por referencia damos la posibilidad a la función de cambiar el valor de la variable pasada, por lo tanto si pasamos los objetos por referencia ahorraremos a la máquina de copiar una y otra vez el valor de un objeto.

Minimiza y optimiza el acceso a disco

Manipular datos de los discos duros o de las memorias flash es mucho más lento que manipular datos almacenados en memoria por eso si vas a manejar archivos ten en cuenta este punto.

Un buen número de utiles consejos más específicos para Php los puedes encontrar aquí.

1 – Inicializa las variables antes de utilizarlas

2 – Dedica tiempo a estudiar PHP, está en un continuo proceso de crecimiento y sus características van cambiando con el tiempo.

3 – Incrementar una variable en un método es lo mas rápido, del mismo modo que hacerlo en una función.

4 – Incrementar una variable global es dos veces mas lento que una variable local.

5 – Incrementar la propiedad de un objeto (ej. $this->prop++) es 3 veces más lento que incrementar una variable local.

6 – Incrementar una variable indefinida es 9 ó 10 veces más lento que una ya pre-declarada.

7 – El hecho de declarar una variable global a pesar de que no la utilices en ninguna función realentiza tu script, PHP tiene que chequear si la variable existe.

8 – La llamada a una función con un parametro toma aproximadamente el mismo tiempo que de 7 a 8 operaciones con variables locales, y esa misma llamada a un método supondrían unas 15 operaciones.

Por último veamos algunos de los consejos más comunes de optimización (PHP) que publicamos hace ya algún tiempo.

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

1 Respuesta a Técnicas de optimización de código

Avatar

RodrigoCR

30 de septiembre de 2011 a las 5:24 am

Cómo te gusta escribir de temas que no sabes… No hablas ni en términos “matemáticos” ni en términos de complejidad computacional (big o notation), y mucho menos sobre temas de Lenguajes de Programación (desde el lado de Teoría de la Computación).
Eso de que i++ es más lento que ++i … WTF? son operaciones completamente diferentes! es decir, hay ocasiones en las que tienes que usar i++, y lo único “extra” es que estás guardando una copia de la variable en memoria, pero con las computadoras de hoy en dia, no creo que tengas mucho problema no? Es una microoptimización demasiada quisquillosa.

Dejar un comentario