El lenguaje de programación no es lento, tu algoritmo lo es

Ya de por sí existen cientos de debates y discusiones sobre cuál lenguaje de programación es mejor que otro, y en estos se toca bastante el tema de la velocidad.

La tecnología ha avanzando bastante, ahora los usuarios y muchos desarrolladores están acostumbrados a la instantaneidad, el simple hecho de que una página web cargue con un segundo de retraso o que el tiempo entre la selección de un botón y su respectiva acción sea de varios cientos de milisegundos es suficiente para ser catalogado como lento o al menos poco responsivo.

Por esas razones la velocidad es una propiedad que se aprecia mucho en un software, en algunos casos incluso se sobreestima llegando a generar problemas como la optimización prematura, pero en lo que respecta a los lenguajes de programación el tema de la velocidad no es algo tan fácil.

La optimización prematura es un serio problema que me gustaría tratar a futuro.

De cara al usuario, la velocidad o el “rendimiento” aparente de un software se puede reducir de forma simple en el tiempo que tarda este en recibir un estímulo y enviar una respuesta.

Ahora, de cara al desarrollador, la velocidad se ve determinada por muchos factores. En la web abundan los benchmark donde se compara la velocidad de varios lenguajes a la hora de ejecutar un determinado algoritmo, y por muy contradictorio que pueda parecer, un lenguaje de programación puede ser mas rapido o mas lento que si mismo.

El funcionamiento interno de un lenguaje

La velocidad y el uso de memoria de un lenguaje de programación no son siempre los mismos, y tampoco son constantes. Estos dependen en primer lugar del intérprete o compilador que se está usando, véase el ejemplo de Facebook, que buscando mejorar la velocidad de su código escrito en PHP reescribieron parte del motor Zend (el intérprete “oficial” de PHP) y a esto lo llamaron Hack, entonces, el código de PHP ejecutado con Hack es mas rapido que el codigo de PHP interpretado con Zend (lo logramos, PHP es más rápido que PHP).

Ahora, en la actualidad los lenguajes de programación gozan de una mayor complejidad, un motor moderno ya no solo se puede encargar de interpretar un código, también se puede encargar de compilarlo al lenguaje de la máquina donde se ejecuta, lo cual se conoce como JIT o Compilación en Tiempo de Ejecución, esto se hace con la finalidad de reducir el tiempo de ejecución del código.

Por si fuera poco, pueden existir múltiples motores o intérpretes para un mismo lenguaje y estos pueden estar a su vez escritos en diversos lenguajes de programación o pueden tener una estructura interna muy diferente. El caso más famoso es Javascript que posee los motores de V8, SpiderMonkey, Chakra, entre otros tantos, aunque también está C con compiladores como GCC o Clang.

Benchmark que compara varios lenguajes, incluyendo sus diferentes implementaciones las cuales incluso dan un rendimiento muy diferente.

Así que no basta con preguntar cual es la velocidad y/o el uso de memoria de Javascript para ejecutar cierto algoritmo, también hay que preguntar cuál es el motor que se está usando.

La importancia de la velocidad

Ya entendido que la velocidad no la define el lenguaje sino su implementación, hay que entender también la importancia de la misma. Tener una mayor rapidez de ejecución en un lenguaje es algo bueno, no lo niego, pero su importancia depende del caso de uso, y en la mayoría de los casos se busca que haya un buen balance costo-beneficio, el cual puede ser la velocidad de ejecución contra la velocidad de desarrollo.

Una aplicación de calculadora básica hecha en C++ puede ser más rápida que su contraparte en Python (suponiendo que se siguen los mismos algoritmos), pero, esta diferencia de velocidad de muy pocos milisegundos ¿realmente vale la pena?. Sin contar que desarrollar la aplicación en un lenguaje como Python puede tomar hasta tres veces menos tiempo que desarrollarla en C++ (sin contar que puede ser más segura y fácil de mantener a futuro).

La velocidad de un lenguaje de programación es un factor determinante sólo en casos excepcionales donde se busca manejar gran cantidad de datos o procesar muchos cálculos por segundo, como por ejemplo una página web bastante concurrida o un videojuego con gráficos y mecánicas avanzadas, por ende, esa velocidad extra no vale realmente la pena ni es notable para páginas web pequeñas con pocos visitantes o aplicaciones de escritorio minimalistas.

El algoritmo es lo que importa

El factor determinante en la velocidad de ejecución en un software depende mayormente del algoritmo que se usa, no del lenguaje.

Diferentes algoritmos de ordenación cuya velocidad se reduce exponencialmente, marcando una gran diferencia.

De nada sirve usar un lenguaje como C si no se van a usar los algoritmos correctos, una búsqueda sobre una lista enlazada de miles de elementos en C sera muchisimo mas lenta que una búsqueda sobre un mapa de hash hecho en Javascript, y en este caso en particular la diferencia puede ser monstruosa, arruinando las ventajas de usar un lenguaje como C antes de Javascript.

Entonces para la solución de un problema debe de escogerse las herramientas correctas (en este caso el lenguaje de programación junto a su implementación), y las técnicas correctas (en este caso los algoritmos).