Java Bytecode Timing Cost Models

Anuncio
Java Bytecode Timing Cost Models
Guillermo Roman Dez
guillermo.roman.diez@gmail.com
Doctorado Lenguajes y Sistemas Informaticos e Ingeniera del Software
Computational logic, Languages, Implementation, and Parallelism Laboratory
Facultad de Informatica
Universidad Politecnica de Madrid
Abstract
Poder estimar el tiempo de ejecucion de un programa, en tiempo de
compilacion puede ser muy util, en el desarrollo de software. El presente
trabajo analizara la posible relacion entre el codigo Bytecode ejecutado
por la Java Virtual Machine y el tiempo de ejecucion del programa. Utilizando esta posible relacion, el objetivo principal del trabajo es detallar
y probar diferentes modelos para estimar, tan preciso como sea posible,
la ejecucion de un programa Java. La estimacion de la duracion de la
ejecucion de un programa puede ser una potente herramienta en muchos
escenarios, como por ejemplo en los sistemas distribuidos, en el momento
de la asignacion de tareas, Actualmente la Java Virtual Machine proporciona herramientas para hacer "proling", pero carece de una herramienta
para la estimacion de los tiempos de ejecucion.
El objetivo nal del proyecto es desarrollar un modelo de costes capaz
de estimar el tiempo de ejecucion de un programa Java sin necesidad de
ejecutarlo. Con este objetivo en mente este trabajo propone diferentes
modelos de costes para analizar la posible relacion entre las instrucciones
Bytecode y los tiempos de ejecucion. Bytecode es un "lenguaje" muy similar al ensamblador, que es un lenguaje mas cercano al lenguaje maquina
que el codigo fuente Java.
1
Breve Descripcion
El crecimiento del uso de Java en los ultimos a~nos esta siendo importante, no
solo en entornos profesionales y de investigacion; sino tambien en otros entornos,
como puede ser el de la telefona movil, ya que gran parte de los telefonos moviles
actuales incorporan una Maquina Virtual Java (JVM) para ejecutar programas
Java.
Tener la posibilidad de realizar una estimacion able de los tiempos de ejecucion de un programa es una de las carencias de los entornos actuales. Disponer
de una estimacion able del tiempo de ejecucion sera una herramienta muy util
en multiples escenarios, como puede ser la asignacion de tareas en un entorno
distribuido o para conocer el tiempo que tardara en ejecutar un proceso que se
prevee largo en el tiempo.
Java, al tratarse de un lenguaje multiplataforma con el lema, "write once,
1
run everywhere", dispone de un lenguaje intermedio, el codigo Bytecode, como
paso previo a la ejecucion del programa. De esta forma cualquier JVM esta en
disposicion de ejecutar codigo Bytecode. Este codigo es similar a un lenguaje en
ensamblador y tiene un conjunto de instrucciones denido, con lo que se trata de
un lenguaje "cercano" al lenguaje maquina. Utilizar el codigo Bytecode frente al
codigo Java presenta una serie de ventajas importantes, como la independencia
del compilador con el que se haya generado, es realmente el codigo que se va a
ejecutar en la maquina virtual, tiene un conjunto de instrucciones denido y no
depende de libreras,
Por las razones comentadas, el trabajo trata de establecer la posible relacion
entre el codigo Bytecode ejecutado y el tiempo de ejecucion de un programa.
Una vez conocida la relacion estaramos en disposicion de estimar el tiempo de
ejecucion de un programa Java. El presente trabajo plantea y desarrolla varios
modelos de costes relacionando el codigo Bytecode con el tiempo de ejecucion.
teniendo en cuenta unicamente cuenta esos 2 factores. Los modelos que plantea
el trabajo son los siguientes:
Modelo Basico: Este modelo establece la premisa "Todas las instrucciones
Bytecode tardan el mismo tiempo en ejecutar". Se trata de un modelo que
no distingue entre las diferentes instrucciones Bytecode, armando que,
de media, todas tardan el mismo tiempo en ejecutar.
Modelo Grupo: Este modelo rena el modelo anterior, ya que empieza a
distinguir entre tipos de instrucciones. Este modelo se basa en la hipotesis
"Todas las instrucciones de un determinado tipo tardan el mismo tiempo
en ejecutar"
Modelo Sistema: Se trata del modelo mas especco de los modelos planteados, establece la siguiente premisa "una instruccion Bytecode especca
tarda el mismo tiempo en ejecutar en cualquier programa"
Modelo Maquina: Se trata de un modelo que trata de bajar un escalon mas y
utilizar el codigo maquina para la estimacion de los tiempos de ejecucion.
Se basa en una hipotesis muy similar a la del modelo basico, es decir,
"Todas las instrucciones maquina tardan el mismo tiempo en ejecutar".
Utilizando estos modelos, el trabajo describe las acciones necesarias para
estar en disposicion de estimar los tiempo de ejecucion de un programa. Estos
pasos dependen del modelo seleccionado y se detallan a lo largo del trabajo.
Basicamente las acciones para todos los modelos son dos;
1. Calibracion. La calibracion del modelo es el paso fundamental de la herramienta, ya que es en esta fase en la que se calculan los parametros
para la estimacion. Un pequeo error en los valores estimados hace que los
resultados de las estimaciones se vean afectados.
Hay que tener en cuenta que, dependiendo del modelo que estemos calibrando, los parametros son diferentes. Para la calibracion del modelo se
han desarrollado unos programas Java especcos para cada uno de los
modelos, ya que cada modelo tiene sus caractersticas especcas.
2. Estimacion del tiempo de ejecucion. Para esto tendramos que ejecutar
simbolicamente el programa para obtener las instrucciones Bytecode que
2
se ejecutaran, una vez conocidas las instrucciones Bytecode ejecutadas hay
que aplicar los calculos de cada uno de los modelos para estimar el tiempo
de ejecucion.
Para la ejecucion simbolica de un programa Java es fundamental para poder
utilizar el codigo Bytecode para la calibracion y la estimacion. Conocer las instrucciones Bytecode ejecutadas por una maquina Virtual es una carencia de
las maquinas virtuales del mercado, con lo que es necesaria una herramienta
especca. Para esto utilizaremos una herramienta de Ciao, Prolog Proler, que
lleva a cabo la ejecucion simbolica de un metodo y devuelve las instrucciones
Bytecode ejecutadas.La implementacion de la solucion experimental se ha desarrollado en Prolog, utilizando Ciao como compilador y para los procesos de
calibracion y estimacion se ha utilizando un entorno J2SDK 1.4.2.
En el trabajo se lleva a cabo un estudio comparativo de cada uno de los modelos y de diferentes programas de calibracion para cada modelo, ya que cada
modelo puede tener varias posibilidades a la hora de calibrarlo. Dependiendo de
los programas de calibracion utilizados los resultados del modelo pueden variar,
con lo que es importante disponer de unos programas de calibracion adecuados.
Para comprobar los resultados de los modelos se han utilizado algunos programas que resuelven calculos y algoritmos clasicos, como algunos algoritmos de
ordenacion, la resolucion del factorial o la serie de Fibonacci.
El objetivo nal del estudio es llegar a disponer de una herramienta que
permitiera calibrar una unica vez un conjunto Maquina Fsica / Maquina Virtual
y posteriormente estimar el tiempo de ejecucion de un programa Java en ese
entorno.
3
Descargar