abstract: El objetivo de este proyecto de final de carrera es diseñar e implementar un framework de pruebas de eficiencia (performance testing) de codigo en C++. Este framework permitira hacer un seguimiento de la eficiencia de operaciones concretas en situaciones concretas. Este seguimiento se podra realizar mediante un entorno web. Introducción: En los inicios de la informática, la optimización era uno de los campos más estudiados. El empeño de investigar este campo venía dado por las limitaciones de hardware de aquella época y que hacían necesaria una optimización máxima de los procesos, tanto en cuestiones de tiempo, como en memoria utilizada. La necesidad de optimizar el software, hizo que surgieran problemas. Por un lado, el código de los programas era creado con la única finalidad de optimizar el proceso al máximo, sin preocuparse por el diseño de éste, lo que hacía que fuera muy poco inteligible y, por lo tanto, dificilmente modificable. Otro problema existente era la poca previsión de futuro a la hora de crear nuevos sistemas teniendo como única finalidad optimizar al máximo sin pensar en posibles problemas venideros. Un ejemplo popular fue el llamado "efecto 2000" fue debido a que usaron 2 dígitos y no 4 para indicar la fecha con la finalidad de optimizar al máximo el sistema pero sin preveer que, con la llegada del año 2000, los sistemas considerarían que volveríamos al 1900. A medida que transcurría el tiempo, los programas iban creciendo y, con ellos, los problemas. Con el tiempo, el tamaño y la complejidad de los programas aumentó. Estos aumentos provocaron que cada vez fuera más complicado poder gestionar, mantener o evolucionar los sistemas. El crecimiento de los programas también causó que se dedicaran más personas a un mismo programa. Los grupos de trabajo numerosos son un arma de doble filo, ya que se puede dividir el trabajo pero, si la fragmentación del sistema no se hace adecuadamente, agravaría aún más los problemas de gestión y mantenimiento. Con la intención de poner solución a estos problemas y facilitar la producción de software, se introdujo la ingeniería de software. La ingeniería de software crea teorías, métodos y herramientas para desarrollo profesional de software. Estos procesos no se limitan únicamente a la programación, si no que abarca todo el ciclo de vida del software, desde el planning del proyecto hasta el testeo y optimización de éste. Dos de las metodologías de ingeniería de software que más éxito tienen actualmente son el Extreme Programming (XP) y el Free Software. El Extreme Programming es una metodología de desarrollo de software con una estructura diseñada para simplificar el proceso de creación del sistema. Fue creado para trabajar en grupos reducidos y programar rápidamente teniendo presente los contínuos cambios que sufrirá el sistema. Dos de los puntos más relevantes del Extreme Programming son el Refactoring y el testing. El testing se encarga de verificar el correcto funcionamiento de cada una de las funcionalidades del sistema. El refactoring define las pautas que hay que seguir para depurar el código de manera correcta. El testing y el refactoring tienen una estrecha relación ya que hay que confirmar el buen funcionamiento del código antes de refactorizarlo y, para ello, es necesario testearlo con anterioridad. Debido a la depuración del código se pueden obtener dos ventajas: un diseño comprensible y un software optimizado. Tener un diseño comprensible facilita el mantenimiento y evolución del software, mientras que un software optimizado reduce el tiempo de ejecución del sistema. Estas dos ventajas no tienen porqué ir unidas y no es extraño que los cambios que beneficien a una, perjudiquen a la otra. Por eso mismo, hay que pensar hasta que punto interesa sacrificar una de las ventajas por el beneficio de la otra. Según el Free Software Fundation, Free Software es "la libertad de los usuarios para ejecutar, copiar, distribuir, estudiar, cambiar y mejorar el software". La idea principal es poner al alcance de cualquier persona interesada el código fuente del software, ya sea de manera gratuita o con gastos de distribución(1). La ventaja más notoria de esta metodología es poder compartir conocimientos y puntos de vista del proyecto en el que se esté trabajando. Para ello es necesario tener a disposición del usuario comunidades a partir de las cuales pueda poner en común sus ideas. Por esta razón, el software libre comenzó a tener relevancia y popularidad a partir de la expansión masiva de Internet. Otra gran ventaja es la motivación del programador que trabaja en el sistema ya que son ellos los que eligen el proyecto en el que quieren trabajar y los cambios que quieren realizar. Actualmente, las aportaciones de Free software cubren una amplia gama de programas: Nuevos lenguajes de programación de scripting (Python, Perl, Ruby,...), los cuales son más directos y ágiles que otros lenguajes como Java o C. (...) El método de desarrollo de Free Software sigue las pautas de cualquier sistema iterativo, sin embargo, hay diferencias destacables. La diferencia a partir de la cual surgen las características especiales de esta metodología es que el grupo de trabajo es un número indefinido de personas. Este hecho provoca una evolución constante del sistema y sus incrementos son pequeños. Debido a esta evolución, el proyecto debe ser testeado asiduamente, con lo cual, hay más posibilidades de encontrar bugs y solucionarlos. El problema más grave que puede acarrear un sistema de estas características es la posible falta de organización. Para ello, se han creado sistemas, como CVS, que guardan el progreso del código y muestra las modificaciones realizadas cada vez que sufre una variación. El Free Software y Extreme Programming están ligados debido a ciertas características que tienen en común. Ambas metodologías tienen un FeedBack Rápido, iteran incrementalmente y asumen el cambio contínuo. Desde un punto de vista más social y no tan metódico, tanto en FS como en XP es básico saber trabajar con el resto del equipo, comunicándose con ellos y aprender los unos de los otros, mostrando clara y honestamente todos los cambios realizados. Existen varias formas de evaluar lo óptimo de un proceso. Una manera de evaluar la otpimización de un proceso es mediante el tiempo de ejecución. Sin embargo, los resultados no son completamente fiables ya que cada ejecución depende de varios factores: La velocidad y arquitectura del procesador, tamaño de la cache, número de tareas ejecutándose simultáneamente, número de accesos a memoria, errores de lectura y escritura,... En los últimos años ha ido tomando cuerpo una herramienta free software llamada Valgrind que minimiza algunos de estos factores. Valgrind no sirve tiene únicamente funciones de evaluar la optimización, si no que es una herramienta general de instrumentación de código basada en la ejecución controlada y simulada. Valgrind, A la hora de ejecutar el proceso, simula la arquitectura de un 80386, con lo cual, las dependencias arquitectónicas desaparecen y permite obtener una medida independiente de muchos factores, lo que posibilita obtener unos resultados más fiables sin importar la máquina en la que sea ejecutado. Una vez elegida la herramienta a partir de la cual se evaluará la optimiación, puede ser planteado el problema de la regresión. Con Valgrind existe la posibilidad de obtener datos sobre la ejecución del proceso en un momento concreto. Sin embargo, hay dos necesidades que no son cubiertas. Por un lado, cuando se evalúa el coste de optimización de un proceso, el programador puede estar interesado en llegar a saber la eficiencia de ciertas funcionalidades específicamente aislándolas del conjunto general del proceso. Es cierto que con Valgrind se muestran las características de cada una de las funciones pero entender el resultado no es trivial y los valores de la función son el resultado de la ejecución completa del programa (no sé si está muy bien explicado...). Por otro lado, es frecuente que, la funcionalidad que interesa ser evaluada una vez, interese evaluarla siempre. Este tema es conocido como regresión. Valgrind no automatiza el proceso de evaluación de una funcionalidad concreta. La solución de estos dos problemas es la creacion de tests a partir de los cuales se pueda automatizar la evaluación de valores de eficiencia de funciones concretas. Otra tarea es la de mostrar los valores de manera simple evitando la necesidad entender la arquitectura de Valgrind para poder conocer los resultados de la ejecución. Para ello se debe crear un Parser a partir del cual se tomen los valores más importantes de cada test y se evalúe su eficiencia para acabar mostrándolo de forma estructurada y clara. Para que la automatización sea completa, se debería crear un indicador (no sé que palabra poner) a partir del cual, los tests se ejecuten cada cierto tiempo automáticamente. Con la herramienta expuesta hasta el momento, existe la posibilidad de automatizar la evaluación de eficiencia. Sin embargo, no se cubre un factor esencial en la medida de eficiencia como es el seguimiento de ésta. El coste de un proceso no tiene sentido de manera aislada. Para que llegue a ser útil, debe ser comparado con el resto de costes que ha ido teniendo el mismo proceso en sus diferentes ejecuciones. Por lo tanto, es necesario crear una Base de datos en la cual se pueda almacenar los costes de cada uno de los tests en cada una de sus ejecuciones. Una vez creada la Base de datos, interesa crear una interfaz en la cual el usuario pueda ver la evolución de cada test con la opción de configurar alarmas que avisen de un incremento o descenso de eficiencia remarcable.