miércoles, 23 de octubre de 2019
section .text
global _start
_start:
mov eax, [x] "eax" es un Acumulador
sub eax, '0'
mov ebx, [y]
sub ebx, '0'
add eax, ebx
add eax, '0'
mov [sum], eax
mov ecx, msg
mov edx, len
mov ebx, 1
mov eax, 4
int 0x80
mov ecx, sum
mov edx, 1
mov ebx, 1
mov eax, 4
int 0x80
mov eax, 1
int 0x80
section .data
x db '5'
y db '3'
msg db "sum of x and y is "
len equ $ - msg
segment .bss
sum resb 1
global _start
_start:
mov eax, [x] "eax" es un Acumulador
sub eax, '0'
mov ebx, [y]
sub ebx, '0'
add eax, ebx
add eax, '0'
mov [sum], eax
mov ecx, msg
mov edx, len
mov ebx, 1
mov eax, 4
int 0x80
mov ecx, sum
mov edx, 1
mov ebx, 1
mov eax, 4
int 0x80
mov eax, 1
int 0x80
section .data
x db '5'
y db '3'
msg db "sum of x and y is "
len equ $ - msg
segment .bss
sum resb 1
lunes, 21 de octubre de 2019
3.2.3 Herramientas para el análisis del flujo de datos
Herramientas para el análisis del flujo de datos
Existen algunas herramientas que permiten el análisis de los flujos de datos, entre
ellas tenemos los depuradores y desambladores. La optimización al igual que la
programación es un arte y no se ha podido sistematizar del todo.
3.2.2 Criterios para mejorar el código
Criterios para mejorar el código
La mejor manera de optimizar el código es hacer ver a los programadores que optimicen su código desde el inicio, el problema radica en que el costo podría ser muy grande ya que tendría que codificar más y/o hacer su código más legible. Los criterios de optimización siempre están definidos por el compilador.
Muchos de estos criterios pueden modificarse con directivas del compilador desde el código o de manera externa. Este proceso lo realizan algunas herramientas del sistema como los ofuscadores para código móvil y código para dispositivos móviles.
3.2.1 Costo de ejecución (Memoria, registros, pilas)
Costo de ejecución (Memoria, registros, pilas)
Los costos de ejecución son aquellos que vienen implícitos al ejecutar el programa.
En algunos programas se tiene un mínimo para ejecutar el programa, por lo que el espacio y la velocidad de los microprocesadores son elementos que se deben optimizar para tener un mercado potencial más amplio.
Las aplicaciones multimedia como los videojuegos tienen un costo de ejecución alto por lo cual la optimización de su desempeño es crítico, la gran mayoría de las veces requieren de procesadores rápidos (e.g. tarjetas de video) o de mucha memoria. Otro tipo de aplicaciones que deben optimizarse son las aplicaciones para dispositivos móviles.
Los dispositivos móviles tienen recursos más limitados que un dispositivo de cómputo convencional razón por la cual, el mejor uso de memoria y otros recursos de hardware tiene mayor rendimiento. En algunos casos es preferible tener la lógica del negocio más fuerte en otros dispositivos y hacer uso de arquitecturas descentralizadas como cliente/servidor o P2P.
Los costos de ejecución son aquellos que vienen implícitos al ejecutar el programa.
En algunos programas se tiene un mínimo para ejecutar el programa, por lo que el espacio y la velocidad de los microprocesadores son elementos que se deben optimizar para tener un mercado potencial más amplio.
Las aplicaciones multimedia como los videojuegos tienen un costo de ejecución alto por lo cual la optimización de su desempeño es crítico, la gran mayoría de las veces requieren de procesadores rápidos (e.g. tarjetas de video) o de mucha memoria. Otro tipo de aplicaciones que deben optimizarse son las aplicaciones para dispositivos móviles.
Los dispositivos móviles tienen recursos más limitados que un dispositivo de cómputo convencional razón por la cual, el mejor uso de memoria y otros recursos de hardware tiene mayor rendimiento. En algunos casos es preferible tener la lógica del negocio más fuerte en otros dispositivos y hacer uso de arquitecturas descentralizadas como cliente/servidor o P2P.
3.2 Costos
Costos
Los costos son el factor más importante a tomar en cuenta a la hora de optimizar
ya que en ocasiones la mejora obtenida puede verse no reflejada en el programa
final pero si ser perjudicial para el equipo de desarrollo. La optimización de una
pequeña mejora tal vez tenga una pequeña ganancia en tiempo o en espacio pero
sale muy costosa en tiempo en generarla.Pero en cambio si esa optimización se hace por ejemplo en un ciclo, la mejora obtenida puede ser N veces mayor por lo cual el costo se minimiza y es benéfico la mejora.
Por ejemplo:
for(int i=0; i < 10000; i++); si la ganancia es de 30 ms 300s
3.1.4 De mirilla
De mirilla
La optimización de mirilla trata de estructurar de manera eficiente el flujo del programa, sobre todo en instrucciones de bifurcación como son las decisiones, ciclos y saltos de rutinas.
La idea es tener los saltos lo más cerca de las llamadas, siendo el salto lo más pequeño posible.
Instrucciones de bifurcación
Interrumpen el flujo normal de un programa, es decir que evitan que se ejecute alguna instrucción del programa y salta a otra parte del programa.
Por ejemplo: el “break”
Switch (expresión que estamos evaluando)
{
Case 1: cout << “Hola” ;
Break;
Case 2: cout << “amigos”;
Break;
}
3.1.3 Globales.
Globales.
La optimización global se da con respecto a todo el código. Este tipo de
optimización es más lenta pero mejora el desempeño general de todo programa.
Las optimizaciones globales pueden depender de la arquitectura de la máquina.
En algunos casos es mejor mantener variables globales para agilizar los procesos
(el proceso de declarar variables y eliminarlas toma su tiempo) pero consume más
memoria. Algunas optimizaciones incluyen utilizar como variables registros del
CPU, utilizar instrucciones en ensamblador.
Como puntos mas resultantes son:
• La optimización global se da con respecto a todo el código.
• Este tipo de optimización es más lenta pero mejora el desempeño general de todo programa.
• Las optimizaciones globales pueden depender de la arquitectura de la máquina.
3.1.2 Ciclos
3.1.2 Ciclos
Factorización de expresiones invariantes
Expresiones invariantes de bucle: expresiones cuyo valor es
constante durante toda la
ejecución del bucle
>
incuyen constantes y/o variables no modi_cadas en el cuerpo
del bucle
Principio: Mover expresiones invariantes desde el cuerpo
hasta la cabeza del bucle
-> al sacarlas del bucle, pueden quedar dentro de otro
bucle externo)
-> repetir proceso.
Ejemplos:
while (i
>
Algunas optimizaciones son difíciles de implementar
Algunas optimizaciones son costosas en términos de tiempo de
compilación
La optimización más elaborada es difícil y costosa
Meta: Mejora Máxima con costo mínimo
Los costos son el factor más importante a tomar en cuenta a
la hora de optimizar ya que
en ocasiones la mejora obtenida puede verse no reflejada en
el programa final pero si
ser perjudicial para el equipo de desarrollo.
La optimización de una pequeña mejora tal vez tenga una
pequeña
ganancia en tiempo
o en espacio pero sale muy costosa en tiempo en generarla.
Pero en cambio si esa optimización se hace por ejemplo en un
ciclo, la mejora obtenida
puede ser N veces mayor por lo cual el costo se minimiza y
es benéfico la mejora.
Por ejemplo: for(int i=0; i < 10000; i++); si la ganancia
es de 30 ms 300s
3.1.1 Locales.
3.1.1 Locales
Reacondicionamiento de operadores
Cambiar orden de evaluación aplicando propiedades
conmutativa, asociativa y
distributiva.
V:= W * X *( Y + Z )
=
V := ( Y + Z ) * W * X
Código no optimizado, con 7 líneas de código.
1. MOV AX, W
2. MUL AX, X
3. MOV t1, AX
4. MOV AX, Y
5. ADD AX, Z
6. MUL AX, t1
7. MOV V, AX
Código optimizado a solo 5 líneas de código.
1.
2.
3.
4.
5.
MOV AX, Y
ADD AX, Z
MUL AX, W
MUL AX, X
MOV V, AX
Suscribirse a:
Entradas (Atom)