ANTECEDENTES
¿Java es lento?
Java
tuvo sus inicios en 1991, y Sun Microsystems lo liberó al público en 1995.
Aunque el lenguaje heredó mucha de sus sintaxis de C/C++, los objetivos de Java
en aquél entonces pueden resumirse en los siguientes principios:
Simple,
orientado a objetos y familiar.
Robusto
y seguro.
Arquitectónicamente
neutro y portable.
Ejecutándose
en “alto desempeño”.
Interpretado,
con soporte a paralelismo y dinámico.
El
compilador de Java convierte el código fuente en archivos bytecode, que
posteriormente son interpretados por la Máquina Virtual de Java o JVM, en un
modelo de ejecución en pila o stack. Las primeras versiones de Java – previas a
la 1.2 – no realizaban optimizaciones en el bytecode y debido a que las
diferentes versiones de JVM eran más bien genéricas, la ejecución tenía un
desempeño pobre.
A
partir de la versión 1.2 (diciembre de 1998), Java incluyó un compilador
Just-In-Time o JIT, que optimizaba el bytecode en tiempo real de acuerdo a la
carga de trabajo sobre el programa. Como contraste, un modelo de compilación
estática como C/C++ “adivina” dónde se encuentran los cuellos de botella y se
enfoca en esa parte del código para realizar la optimización, pero en el caso
de ambientes dinámicos como las aplicaciones web, el compilador JIT mantiene
una relativa ventaja. Por otro lado, con cada nueva versión de Java, el
lenguaje ha ido mejorando su desempeño, ya sea por optimización en la JVM, el
recolector de basura o el compilador JIT. De acuerdo a este artículo, podemos
ver la comparación en desempeño entre C++ y Java en algunas funciones relativamente
sencillas. Lo sorprendente es lo malo que se desempeña C++ si durante la
secuencia de compilación y enlace (linking) se deshabilitan todas las banderas
de optimización de código. Adicionalmente, de la versión 6 a la 7, Java mejora
su desempeño en alrededor de un 33%.
¿Cómo
se comparan Java y C++ en términos de programas “de la vida real”? Actualmente
abundan muchos microbenchmarks como el arriba mostrado, donde se verifican
funciones muy simples, como manipulación de arreglos o acceso a memoria. Sin
embargo, la mayoría de los casos de prueba son demasiado básicos como para ser
un indicador confiable del desempeño. En la actualidad, existe un estudio
comparativo formal: desarrollado por J. P. Lewis y Ulrich Neumann,
investigadores de la Universidad del Sur de California (USC), el estudio se
basa en 5 pruebas con diferentes versiones de Java y C++. Sus resultados, en
términos generales, fueron los siguientes:
- Al comparar algoritmos numéricos como FFT, factorización de matrices o SORen diferentes arquitecturas y compiladores, los investigadores encontraron que el desempeño de Java en plataformas Intel es razonablemente cercano al de C++ y que Java era más rápido que al menos un compilador en C (KAI sobre Linux Red Hat 5.0). En hardware con Intel Pentium, especialmente con Linux, la diferencia en desempeño es lo suficientemente pequeña como para carecer de importancia.
- Implementando microbenchmarks con y sin cache, los investigadores encontraron que Java se encuentra justo a la mitad entre los mejores y los peores compiladores de C++. Es decir, Java 3 es mejor que gcc 3.2, pero nunca le ganará a un gcc 4.1.0.
BASES TEORICAS
Java
es el que lidero el mercado en cuanto a lenguajes de programación se trata,
nació en el 95 y sigue en vigencia hasta ahora. Es considerado por muchos como
el mejor programador de todos los tiempos. Java es un lenguaje de programación
gratuito que es accesible para todo tipo de personas en la red. He aquí algunas
características de este lenguaje:
- Java está puramente dirigido a objetos, cualquier opción debe pertenecer a una opción.
- Java se ejecuta sobre un procesador virtual, llamado la máquina virtual de Java, capaz de interpretar datos en sistema binario
- El compilador creaun bytecode para la máquina virtual de Java, para ser interpretado luego.
- Automáticamente Java desaparece los objetos cuando se queda sin referencias lo que hace que se libere espacio.
- Los objetos son accedidos mediante referencias.
- Un paquete es una entidad organizativa que permite agrupar clases, interfaces y excepciones, hace que sus elementos dispongan de una visibilidad privilegiada con respecto a objetos externos al paquete.
- No existe la conversión implícita de tipos por considerarse que existen errores potenciales.
- Solo existe la sobrecarga de métodos o funciones, ya que los operadores ya vienen sobrecargados por el compilador.
- No existe la herencia múltiple por ser considerado como poco eficiente, pero esto implico algunas críticas hacia Java.
- Interfaz es el conjunto de especificaciones de métodos y atributos constantes.
- Paquete de Java, como estructura dinámica, útil, los nombres y el funcionamiento son distintos.
- Tiene un único compilador siempre igual.
- Todos los objetos heredan de la clase Object.
C++,
SIGUIENDO DE CERCA LOS PASOS DE JAVA
C++
es un lenguaje de programación que fue creado a mediados de los años 80, y
nació con el objetivo de extender al exitoso lenguaje C, con mecanismo que permitan
la manipulación de objetos. A pesar de nacer primero, el mercado le fue
arrebatado por Java a inicios del siglo 21. Aquí las características que
difieren de las de Java.
C++
se pueden crear programas dirigidos a objetos, a no objetos o a una mezcla de
ambos.
- El programa tiene control sobre el procesador (hardware + S.O.)
- El compilador genera un código de máquina para una plataforma concreta.
- La liberación de memoria no es automática sino manual.
- Existen punteros que permiten explorar la memoria del computador físico.
- No existe el concepto de paquete, lo más cercano es una biblioteca.
- Existe la conversión implícita de tipos (flexibilidad para el usuario)
- Existe la herencia múltiple.
- No existe el concepto de interfaces.
- Librería STL.
- Ningún ancestro común de objetos.
No hay comentarios.:
Publicar un comentario