Comparación de tiempos Java SP con metodos estáticos v/s metodos de objeto
Un error frecuente en programación java es el desconocimiento de métodos estáticos. Los métodos estáticos se pueden usar en condiciones similares a los procedimientos y funciones de los lenguajes procedurales. Los métodos de objetos, en cambio, que modifica o consulta principalmente al objeto al que pertenecen. Si uno desea construir una función que opera totalmente con los parámetros que recibe y no hace uso de ninguno de los atributos del objeto, entonces estamos frente a un candidato a método estático.
A continuación se decribe un ejemplo y se realizan pruebas de tiempos con él.
En el ejemplo se tiene una clase "ObjetoA" que tiene un método no estático. Para poder invocar ese método en necesario instanciar un objeto de la clase e invocar el método con él. La Clase SimulaMalo invoca al metodo del ObjetoA.
El ObjetoB, en cambio tiene un método estático y para usarlo no es necesario instanciar ningún objeto. La clase SimulaBueno hace uso del método estático.
La Clase SimulaOptimo hace uso de un método estático e interno a ella.
Las Clases SimulaMalo, SimulaBueno y SimulaOptimo tienen un método main con el propóstito de ser invocada desde linea de comandos y un método entrada con el propósito de ser invocado desde PL/SQL.
Nota: Estos ejemplos no deben ser seguidos como guias de buenas prácicas de programación en general, sino que están hechos sólo para comparar el impacto en desempeño de distintas prácticas de programación. Por ejemplo ellos no hacen uso de nomenclatura de package ni tienen nombres adecuados de clases, métodos ni atributos.
Para compilar y cargar las clases en la base de datos podemos:
La publicación de las clases para PL/SQL se hace con:
Un script PL/SQL (Sim.sql) para invocar las clases publicadas es:
Con estas clases se ejecutaron los procediemientos con diversos escenarios:
Desde jvm 1.3.1 de sistema operativo con: "time java -cp . Simula <tipo> 10000000", donde tipo puede ser Malo, Bueno o Optimo.
Desde jvm aurora inserto en distintas versiones de Oracle con "@Sim<tipo> 10000000", donde tipo puede ser los mismos del punto anterior.
Aunque las versiones de maquinas virtuales y de BD sean antiguas, se obtienen las siguientes conclusiones:
La mala práctica de usar métodos de objetos en vez de métodos estáticos cuando sea posible tiene un impacto de 1 a 3.
El método estático no tiene diferencias significativas con respecto al método interno.
Hay enormes diferencias entre los tiempos de ejecución de jvm del sistema operativo con respecto al jvm aurora inserto en Oracle 8i. Las comparación es de 1 a 30.
Oracle 9i y Oracle 10g se comportan similares entre ellos pero con una mejora de 1 a 3 con respecto a Oracle 8i.
A continuación se decribe un ejemplo y se realizan pruebas de tiempos con él.
En el ejemplo se tiene una clase "ObjetoA" que tiene un método no estático. Para poder invocar ese método en necesario instanciar un objeto de la clase e invocar el método con él. La Clase SimulaMalo invoca al metodo del ObjetoA.
ObjetoA.java:
public class ObjetoA {
String P1="Parametro1";
String P2="Parametro2";
String P3="Parametro3";
String P4="Parametro4";
String P5="Parametro5";
String P6="Parametro6";
String P7="Parametro7";
public long analiza(long Valor) {
return(Valor*1298);
}
}
SimulaMalo.java:
public class SimulaMalo {
public static String entrada(long Cantidad) {
return procesa(Cantidad);
}
public static void main(String argv[]) {
long now = System.currentTimeMillis();
String Salida=procesa(Long.parseLong(argv[0]));
long later = System.currentTimeMillis();
System.out.println("Milisegundos de ejecucion: "+ ((later-now)));
}
static String procesa(long Cantidad) {
long I1;
long Valor;
ObjetoA ObjA1;
for(I1=1; I1<=Cantidad; I1++) {
ObjA1=new ObjetoA();
Valor=ObjA1.analiza(I1);
}
return("");
}
}
El ObjetoB, en cambio tiene un método estático y para usarlo no es necesario instanciar ningún objeto. La clase SimulaBueno hace uso del método estático.
ObjetoB.java
public class ObjetoB {
String P1="Parametro1";
String P2="Parametro2";
String P3="Parametro3";
String P4="Parametro4";
String P5="Parametro5";
String P6="Parametro6";
String P7="Parametro7";
public static long analiza(long Valor) {
return(Valor*1298);
}
}
SimulaBueno.java:
public class SimulaBueno {
public static String entrada(long Cantidad) {
return procesa(Cantidad);
}
public static void main(String argv[]) {
long now = System.currentTimeMillis();
String Salida=procesa(Long.parseLong(argv[0]));
long later = System.currentTimeMillis();
System.out.println("Milisegundos de ejecucion: "+ ((later-now)));
}
static String procesa(long Cantidad) {
long I1;
long Valor;
for(I1=1; I1<=Cantidad; I1++) {
Valor=ObjetoB.analiza(I1);
}
return("");
}
}
La Clase SimulaOptimo hace uso de un método estático e interno a ella.
SimulaOptimo.java:
public class SimulaOptimo {
public static String entrada(long Cantidad) {
return procesa(Cantidad);
}
public static void main(String argv[]) {
long now = System.currentTimeMillis();
String Salida=procesa(Long.parseLong(argv[0]));
long later = System.currentTimeMillis();
System.out.println("Milisegundos de ejecucion: "+ ((later-now)));
}
static String procesa(long Cantidad) {
long I1;
long Valor;
for(I1=1; I1<=Cantidad; I1++) {
Valor=analiza(I1);
}
return("");
}
public static long analiza(long Valor) {
return(Valor*1298);
}
}
Las Clases SimulaMalo, SimulaBueno y SimulaOptimo tienen un método main con el propóstito de ser invocada desde linea de comandos y un método entrada con el propósito de ser invocado desde PL/SQL.
Nota: Estos ejemplos no deben ser seguidos como guias de buenas prácicas de programación en general, sino que están hechos sólo para comparar el impacto en desempeño de distintas prácticas de programación. Por ejemplo ellos no hacen uso de nomenclatura de package ni tienen nombres adecuados de clases, métodos ni atributos.
Para compilar y cargar las clases en la base de datos podemos:
javac -classpath . ObjetoA.java
javac -classpath . ObjetoB.java
javac -classpath . SimulaMalo.java
javac -classpath . SimulaBueno.java
javac -classpath . SimulaOptimo.java
jar -cvMf Simula.jar Objeto?.class Simula*.class
loadjava -user scott/tiger Simula.jar
La publicación de las clases para PL/SQL se hace con:
create or replace package Simula as
function SimulaMalo(veces in number) return varchar2 as
language java name 'SimulaMalo.entrada(long) return String';
function SimulaBueno(veces in number) return varchar2 as
language java name 'SimulaBueno.entrada(long) return String';
function SimulaOptimo(veces in number) return varchar2 as
language java name 'SimulaOptimo.entrada(long) return String';
end;
Un script PL/SQL (Sim.sql) para invocar las clases publicadas es:
set timing on
spool simula&1._&2
set ver off
prompt ejecucion simula &1 &2
DECLARE
salida VARCHAR2(1000);
BEGIN
salida:=simula.simula&1(&2);
END;
Con estas clases se ejecutaron los procediemientos con diversos escenarios:
Desde jvm 1.3.1 de sistema operativo con: "time java -cp . Simula <tipo> 10000000", donde tipo puede ser Malo, Bueno o Optimo.
Desde jvm aurora inserto en distintas versiones de Oracle con "@Sim<tipo> 10000000", donde tipo puede ser los mismos del punto anterior.
Conclusiones
Comparación de Tiempos obtenidos en máquina (2CPU XEON de 2.6GHz con Hyper-Threading):Columna1 | Columna2 | Columna3 | Columna4 | Columna5 |
TipoJVM | Linux 1.3.1 | Oracle 8iR3 | Oracle 9iR2 | Oracle 10g |
Metodo de objeto(Malo) | 1.67s | 48.85s | 11.34s | 10.83s |
Método estático(Bueno) | 0.34s | 13.51s | 4.13s | 3.41s |
Método interno(Optimo) | 0.34s | 13.51s | 3.92s | 3.39s |
Aunque las versiones de maquinas virtuales y de BD sean antiguas, se obtienen las siguientes conclusiones:
La mala práctica de usar métodos de objetos en vez de métodos estáticos cuando sea posible tiene un impacto de 1 a 3.
El método estático no tiene diferencias significativas con respecto al método interno.
Hay enormes diferencias entre los tiempos de ejecución de jvm del sistema operativo con respecto al jvm aurora inserto en Oracle 8i. Las comparación es de 1 a 30.
Oracle 9i y Oracle 10g se comportan similares entre ellos pero con una mejora de 1 a 3 con respecto a Oracle 8i.
Comentarios
Publicar un comentario