Otro de mis pequeños proyectos

Una forma sencilla de hacer bien las cosas

Para romper este «silencio» de casi un mes debido a la Navarparty y al trabajo, volvamos a la carga con un pequeño post.

Quiero tratar el tema de «cómo hacer bien las cosas programando» con un sencillo ejemplo que pasó el otro dí­a por mis manos. Y para ello contaremos con dos actores, un array y un if. Supongamos que tenemos los siguientes datos:

$a = array
 array('from' => 0, 'to' => 100),
 array('from' => 101, 'to' => 250),
 array('from' => 250, 'to' => 1000),
 array('from' => 1001, 'to' => 2000)
);

Nuestro sencillo código va a retornar el í­ndice del array $a en el que se encuentra un número $b. Ahora bien, tenemos dos formas de hacerlo:

Opción a:

function getRange($b) {
 foreach($a AS $index => $actual) {
 if($actual['from'] <= $b && $actual['to'] >= $b) {
 return $index;
 }
 }
}

Opción b:

function getRange($b) {
 foreach($a AS $index => $actual) {
 if($actual['to'] >= $b && $actual['from'] <= $b) {
 return $index;
 }
 }
}

El único cambio es el if que, como se puede ver, cambia el orden de las condiciones.

Entonces, hacemos la pregunta, ¿cuál de las dos opciones es más eficiente? Es posible que no lo veas claro, pero si lo miras un poco veras como en la mayorí­a de los casos es la opción b. Únicamente son igual de eficientes cuando $b se encuentra entre los valores de la primera posición.

¿Y por qué es más eficiente la opción b? La respuesta es porque dentro del if, al tener un Y lógico (los dos ampersands &&) si la primera condición es falsa, la otra condición ni siquiera se evalúa. Es decir, nos ahorramos que el microprocesador tenga que hacer esa comprobación lógica. Y este caso se da si pensamos que $b = 150. Para la opción a el if tiene que ejecutar ambas condiciones (0 <= 150 && 100 >= 150) para descubrir que es false y pasar a la siguiente iteración, mientras que con la opción b bastarí­a con la primera comprobación (100 >= 150) para saber que es false y pasar a la siguiente iteración.

Si se hace este if una única vez estamos hablando de una parte muy pequeña de un segundo, pero si esta tarea es muy repetitiva o el array tiene muchas posiciones, el efecto es claramente favorable e incluso se puede notar directamente.

Este sencillo ejemplo demuestra como pensar un poco las cosas y cambios muy pequeños en tu código pueden hacer que tengas un código mucho más optimizado y que te de mayor rendimiento.

Y por si quieres rizar el rizo, la opción a puede ser más eficiente que la b, pero sólo en el caso de que se recorra el array de forma descendente o este ordenado de forma inversa.

1 comentario

  1. epplestun

    Los pequeños detallers marcan las grandes diferencias entre un buen programador y uno no tan bueno 😉

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *