Me he suscrito a la lista de correo con el correo [email protected].
Me he dado de alta en el sistema de envío de prácticas, y tengo el nick domingolopezoller y el id 51
INTRODUCCIÓN
El objetivo de esta práctica es comprender la utilidad del profiler a la hora de realizar nuestros programas lo más eficientes posibles y
encontrar los puntos del programa más lentos para mejorarlos.
Hay que tener en cuenta que podemos estar mejorando una función mucho tiempo y sin embargo ser muy poco su uso por lo que funciones que en apariencia
parecen eficientes pueden estar ocupando todo el tiempo y estas son las que tenemos que mejorar si podemos.
En la universidad nos hacen pensar en la eficiencia a nivel de número de búcles, tamaño de entradas y la recursividad, pero no nos dicen
nada a cerca del contenido que tenemos que darle a una función y este punto es lo que quiero mostrar en la práctica.
No quiero ver un ejercicio super complicado que de primeras utilice celdas enlazadas y resulte mejor hacerlo con la STL de C++,
eso ya nos lo enseñan en Teoría de Algoritmos y ya sabemos que lo segundo es más eficiente,sino que cosas que aparentemente tienen la misma eficiencia
resulta que en la práctica los tiempos pueden variar mucho de hacerlo de una forma a otra.
El código que voy a utilizar en esta práctica es el siguiente:
Este código puede verse aquí.
En este código por un lado voy a comprobar:
Operaciones equivalentes ofrecen resultados de tiempo diferentes (división vs desplaza)
Demostrar que la eficiencia teórica 'no' garantiza la eficiencia práctica (inserta vs inserta2)
La función división se encarga de realizar la división por 2 del dato pasado como argumento con el operador '/'
La función desplaza se encarga de realizar el desplazamiento a la derecha de 2 o lo que es lo mismo dividir por 2 en binario
Salta a la vista que ambas funciones son las mismas, cambiando el nombre para identificarlas, y que se va a obtener el mismo resultado. Sin embargo de
MP2 sabemos que la operación binaria va a ser más rápida y esto lo verificaremos con el profile.
La función inserta modifica el valor en la posición pos del vector y realiza la suma desde la posición 0 a pos devolviendo el resultado
La función inserta2 modifica el valor en la posición pos del vector e incrementa en la variable global suma el valor que se pasa por argumeno, no recorre todo el vector hasta pos, y devuelve el resultado
Del mismo modo que antes se tienen funciones que hacen lo mismo y por teoría de algoritmos se diría que ambas tienen una eficiencia constante O(1)
dado que el bucle está acotado por pos y se hace en tiempo constante.
Sin embargo esa 'constante' va a ser mucho mayor en inserta que en inserta2 y eso repercute en más tiempo y se verá en el profile.
Quizá solucionar eficiencia para las operaciones es costoso pero arreglar este tipo de funciones es una tontería y estamos ganando mucho tiempo.
Dado que realizar una ejecución no supone coste de tiempo para esta máquina hay que hacer que esas funciones se ejecuten una cantidad de veces considerable
para ver así su duración en el archivo que nos dé el profile.
Para ejecutar el profile hay que seguir las siguientes instrucciones en Linux:
Este script se encuentra en el fichero ejecutar que hay en la carpeta archivos o pulsando Aquí
De esta ejecución se obtienen los ficheros resultado y resultado2 que muestran el resultado con diferente formato según modo texto o modo pantalla
Lo siguiente se puede extraer del fichero resultado.txt
Lo siguiente se puede extraer del fichero resultado2.txt
Puede verse que la información que se obtiene en uno y otro es la misma Nota: Todos los ficheros se encuentran en la carpeta archivos adjunta a este fichero
Tal y como se predijo en los puntos a tratar en esta práctica vemos que se verifica el hecho de que división e inserta son las funciones que más tiempo consumen, sobre todo
inserta por el bucle interno que tiene para 10000 valores, y que las funciones desplaza e inserta2 consumen mucho menos tiempo cuando están haciendo exactamente lo mismo.
El profile nos ha permitido comprobar que
CONCLUSIONES
Los profilers son herramientas muy útiles para poder desarrollar un código lo más eficiente posible ya que se puede ver que haciendo un cambio
muy pequeños se ha conseguido pasar de una ocupación del 45.45% al 0% de tiempo total en el caso de la prueba de insertar e insertar2. Lo mismo
pasa con división y desplaza donde se ve la mejora de 2.27% en desplaza.
Por lo tanto, el uso de estas funciones más optimizadas van a permitir obtener mejores resultados a la larga, ya que una función que se repita mucho
y este muy optimizada hará que el programa en media sea rápido más que si optimizamos una de las funciones que se llama poco.
Ahora bien, particularmente creo que los profilers podrían aportar esa información sin tener que recurrir a desarrollar tantas evaluaciones,
es decir, que con una sola te de esta información.
Otro factor en contra de los profilers es su dificultad para entender el documento cuando el programa ya tiene cierta envergadura.
Obviamente, he utilizado un ejemplo muy simple, pero a medida que se complica el documento interpretar este documento puede ser un auténtico
infierno por la cantidad de funciones y la información que se presenta. Nota: Yo estoy hablando del profiler de C++, es posible que otros profilers de JAVA o Visual Studio entre otros sí aporten o mejoren la información que proporciona este
DOMINGO LÓPEZ OLLER Ingeniero Técnico Informática Sistemas
Práctica 3 de Diseño y Evaluación de configuraciones.