Ir directamente al contenido

¿Java es lento?

29 marzo 2010

Lo que voy a decir no es nada muy novedoso. En realidad, lo más llamativo es que en pleno año 2010 haya que seguir repitiendo algunas verdades tan trilladas. Pero me temo que sigue siendo necesario: muchos profesionales de la informática repiten una y otra vez el antiguo mantra de que Java es demasiado lento. Y no me refiero sólo al chaval que leyó hace diez años algo sobre Java en una revista de informática. Yo se lo he oído repetir incluso a varios responsables de importantes proyectos, de esos proyectos que cuestan mucho dinero, unos profesionales de los que cabría esperar, al menos, algunas nociones básicas de como funciona una plataforma. Y, sin embargo, ahí están repitiendo los mismos clichés que en 1996, como si el mundo no hubiera cambiado.

¿Como surgió el mito de que Java es lento?

Cuando Java nació en el año 1995, las aplicaciones web aún eran ciencia ficción. En esa época un megabyte de memoria costaba 30$ ( ≈ 30.000 dólares 1GB) y un procesador Pentium a 120Mhz salía a 935$ a precio de mayorista.

El desarrollo se centraba principalmente en aplicaciones de escritorio y los principales rivales de Java eran C y C++. A diferencia de C o C++, el código fuente de Java no se compila directamente a código máquina, sino que se transforma primero en un formato intermedio, el bytecode, que luego es interpretado por la máquina virtual.

Los primeros benchmarks no tardaron en llegar e indicaban claramente que un programa Java se ejecutaba entre 10 y 30 veces más lento que un programa equivalente en C++.

Esto era Java alrededor de 1996, hace catorce años, es decir, una eternidad en el mundo de la informática.

Hoy día las cosas han cambiado mucho. En primer lugar, la propia máquina virtual de Java (la JVM) ha evolucionado pasmosamente hasta convertirse en una pieza de software altamente optimizada.

La máquina virtual de Java cuenta hoy en día con compiladores JIT (Just In Time) que traducen el bytecode a código nativo de la máquina. Además, la JVM también puede monitorizar qué partes del programa se ejecutan más a menudo y optimizar la compilación para el uso real que se le da a la aplicación. Es lo que se conoce como Optimización Adaptativa, y es una ventaja muy importante con la que no cuentan los compiladores tradicionales.

Esas son las dos principales mejoras de las que se ha beneficiado la máquina virtual de Java, pero no las únicas.

El resultado de todos estos cambios, es que Java, a día de hoy es tan rápido o más que C++. Dependiendo de quién haga el benchmark, Java resulta ser un poco más rápido o un poco más lento.

Por ejemplo, el The Computer Language Benchmarks Game es un juego de benchmarks basados en pruebas de cálculo aritmético sencillas donde se comparan distintos lenguajes. En esas pruebas Java, cuando descontamos el tiempo de arranque de la máquina virtual, aparece en los primeros puestos, sólo por detrás de C, C++ y ATS, sacando bastante ventaja a otros lenguajes como C# y barriendo literalmente a los lenguajes dinámicos como Ruby, Python o PHP. Java resulta ser unas 80 veces más rápido que PHP.

No obstante, los benchamarks que miden calculos aritméticos sencillos no se correlacionan demasiado bien con el rendimiento de sistemas complejos, donde la interacción entre distintas partes de la aplicación, las librerías de E/S, o la concurrencia son muy importantes. En benchmarks donde se comparan sistemas complejos, Java se muestra a menudo más rápido que C++. Por ejemplo, algunos benchmarks indican que el servidor web Apache Tomcat (escrito en Java) puede ser más rápido que su primo Apache httpd (escrito en C).

Pero todo esto tiene una importancia relativa, porque el mayor cambio que ha habido en el mundo de Java no ha sucedido dentro de la plataforma, sino fuera de ella. Los principales rivales de Java para crear aplicaciones web ya no son C y C++ sino, más bien, PHP, Ruby o Python. Y Java es mucho más rápido que cualquiera de estas tres alternativas. Y lo que es peor: tampoco importa. Ruby, por ejemplo, es lo suficientemente rápido para hacer aplicaciones web con un buen rendimiento. Como ya he explicado en otra ocasión, el hecho de que Ruby sea más lento que Java no lo hace menos escalable.

Pero, me diréis, «existen muchas aplicaciones en Java leeeentas y pesadas, yo las he visto. Fíjate en Eclipse, me puedo tomar un café mientras arranca.» Y es cierto. Pero eso no es culpa de la plataforma Java, sino de los programadores que crearon esos engendros. Durante muchos años, J2EE (el entorno en el que se han desarrollado la mayoría de las aplicaciones Java empresariales) ha sido una plataforma sobrecargada de ornamentos inútiles y pesados. No es de extrañar que una aplicación que usa los EJB 2.0 distribuidos vaya lenta. Pero el fallo está en utilizar EJBs distribuidos, no en el lenguaje de programación ni en la máquina virtual.

Y eso nos lleva a la verdadera razón de por qué ha sobrevivido tanto tiempo la monserga de que Java es lento: es una excusa perfecta para hacer software malo. Los desarrolladores pueden hacer un truño de aplicación, y cuando no funcione bien se encogerán de hombros y dirán: ‘qué quieres, no es culpa mía, ya sabes que Java es lento‘.

From → Programación

16 comentarios
  1. Avatar de ingeniods

    Aun asi java sigue siendo pesado, no lento las capacidades de las maquinas donde se ejecuta ahora han cambiado pero java sigue ocupando mas RAM de la que necesita eso hasta ahora pero pronto con la JDK7 las vainas van a cambiar

  2. Avatar de Alberto Fernández-Capel

    Hola, ingeniods.

    Insisto, ¿Java consume más memoria en comparación con qué? Puede que C o C++ gasten un poco menos de memoria, pero a cambio de que esa memoria se tiene que gestionar manualmente y es más probable que se acabe filtrando.

    En comparación con Ruby, PHP, Python o C#, Java no consume más memoria.

    De todas maneras, estando el precio del GB de memoria a 11$, en una aplicación web típica la falta de memoria nunca debería ser un problema. Y si lo es, se trata seguramente de un fallo de programación, no problema de la plataforma.

    Las aplicaciones Java suelen ser pesadas porque utilizan frameworks y servidores de aplicaciones sobrecargados de funcionalidades que sirven para bien poco y acaban complicando mucho las aplicaciones (por ej. EJBs 2.0). Estas librerías y entornos sí que pueden llegar a consumir demasiados recursos, pero, insisto, eso no es un fallo de la plataforma sino del diseño de los frameworks y los servidores de aplicación.

    Saludos

  3. Avatar de José Galisteo

    Creo que has dado con el clavo, el problema de la «lentitud» seguramente sea de los programadores y no de lenguage en sí. Un elefante siempre va a tardar más en levantarse que un ratón esté escrito en el lenguaque que sea.

    Encima el hecho de que nada más salir de la carrera los pongan a picar como locos de becario hasta que el proyecto salga sea como sea no ayuda.

    Yo programo en ruby, pero he tenido que tocar un proyecto con jruby y a la hora de desarrollar es un infierno por lo que tarda el servidor en arrancar, luego es verdad que va bastante bien.

  4. Avatar de Alberto Santiago
    Alberto Santiago permalink

    Hola ante todo,

    Le tienes hincha a PHP eh, jejeje, realmente lo mejor que tiene PHP es que es un lenguaje de plantillas hablando pronto y mal, para mi de lo mejorcito para hacer webs donde el 90% del rendimiento depende de las consultas a bbdd, Blogs, portales, periodicos, etc, por no hablar de la rapidez, flexibilidad y sencillez de desarrollo que tiene (Implementar los patrones más complejos con PHP es trivial). No es lo mismo hacer build & clean que hacer un refresh de la pagina y debugearla directamente con xdebug o con lo que quieras.

    Obviamente para calculo y procesamientos complejos olvidate, java es infinitamente mejor que php, vamos no tiene nada que ver. Aunque dependiendo de lo que quieras tampoco es que sirva para «todo», para aplicaciones 3D, se pueden hacer pero puede ser un infierno…. para concurrencia, los hilos fueron una buena aproximación llena de buenas intenciones pero Earlang mezclado con java puede ser mejor opción, cada proyecto es un mundo…..

    Yo abogo por no ponernos barreras «estadisticas», yo ahora mismo en un mismo proyecto tenga partes en XUL con javascript, PHP, Bash, Java (empece con Python pero no me acaba de gustar…. ), etc… y se llevan francamente bien entre ellas…

  5. Avatar de Alberto Fernández-Capel

    Qué va Alberto, no le tengo ninguna «hincha» a PHP, me parece que si se sabe utilizar es un lenguaje muy interesante y que se pueden hacer grandes cosas con él, a pesar de que sea más lento que Java. Ahí están, por ejemplo, Facebook o Flickr para demostrarlo.

    Yo, personalmente, prefiero programar en Ruby que también es más lento que Java, aunque esto casi nunca es un problema. Eso sí, no se me ocurriría utilizar Ruby para todo.

    Saludos

  6. Avatar de Roberto
    Roberto permalink

    No creo que sea un mito. La verdad es la vida real. Sobre todo si se va a programar para PCs no recomiendo usar Java.
    ¿Ahora como se descubre que Java es lento? Bueno tecnicamente Java no es lento, simplemente ocupa demasiados recursos y toda aplicacion hecha en Java se ve con un desempeño lento en la Interfaz Grafica.
    Para verlo solo necesitas ejecutar aplicaciones Java. Con un poco de experiencia, puedes ver que cualquier aplicacion hecha Java tiende mucho mas a ciclarse, a dejar pasmada la interfaz, a colapsar.
    Al estar usando Windows, es facil ver que una aplicacion esta hecha en Java, por que tiende a quedarse pasmada con la clasica pantalla gris.
    El resto de las aplicaciones no tienen esos problemas.
    El problema es creer que Java es la panacea para todo. Java es bueno para aplicaciones distribuidas, multiplataforma, o para aplicaciones de ambientes que no sean Windows.
    Pero si se va a programar para Windows mejor no usar Java.

  7. Avatar de ingeniods

    Estoy total y completamente de acuerdo con Roberto

  8. Avatar de Guidex
    Guidex permalink

    Yo lo he comprobado en muchos programas, puede ser que java sea rapido, pero como dicen mucho consume muchos recursos y por ende mucha memoria, y no creo que sea la solucion comprar mas memoria como lei por ahi, aunque esten economicas, deberían optimizar esta parte.

    Oviamente estoy hablando de mucho consumo de memoria = computadora lenta.

  9. Avatar de M3g4m4n

    lo siento… java si es lento… pesado… y para colmo la mayoría de aplicaciones lucen terribles, poco intuitivas y caras de realizar… IBM tiene muchas aplicaciones basadas en java lentas, poco funcionales, ABURRIDAS. SUN también tienen todo un set de herramientas basadas en este lenguaje, armatostes lentos, inestables. Los desarrollos para web se vuelven largos, tediosos, poco intuitivos en cualquiera de los frameworks comparado a otros lenguajes creados para web exclusivamente.
    mi opinión, java debe quedarse en el pasado…

  10. Avatar de Cesar
    Cesar permalink

    Bueno yo tambien tengo la experiencia de usar java y php, y las aplicaciones en java son realmente lentas en comparacion con las de php, puede ser que sea mas rapido en hacer cosas simples pero para uso de aplicaciones mas trabajadas y por lo tanto el uso de frameworks se nota bastante la diferencia y si no vas a usar esas caracteristicas de java ¿para que usarlo?, ¿solo para hacer formularios de prueba?… en entornos de produccion yo descartaria java

  11. Avatar de Omar
    Omar permalink

    Acabo de ver el post. Francamente es cierto, usar Java es lento por todos los frameworks que se usan.
    Por ejemplo para el típico desarrollador Java le hablas de un proyecto en el que tienes que manejar al personal de la empresa, en donde cada uno tiene sus roles y privilegios. Más a parte cada usuario tiene acceso a uno o más módulos de la aplicación y pues la empresa tiene 15 módulos bastante llenos de información. De ahí el desarrollador Java ya piensa: «PostgreSQL + Java EE + JPA sobre Hibernate + Spring + Seam/Weld + JSF con iceFaces». Claro está que el stack Java es pesado (cargar Spring, Hibernate, Seam/Weld, iceFaces, JSF a parte del entorno =$).

    En cambio los desarrolladores PHP/Python cuando más utilizan algún ORM. Si en PHP y Python existen frameworks, pero de verdad que no se necesitan; son lenguajes tan flexibles, sencillos y en el caso de Python ordenados, que de verdad lo que uno necesita básicamente es mod_php o mod_python o cgi y ya está.
    Con Ruby la cosa es un poco más pesada ya que para web tenemos 2 opciones Rails o Merb (las demás como Ramaze, están algo verdes comparadas con estas dos). Aunque de ser posible usar algo cómo mod_ruby o cgi con ruby, aplicaría lo mismo que para Python.

    Más no por ello quiere decir que en Java no haya opción, todos tenemos información sobre Groovy y Scala (este último ha captado totalmente mi atención), principalmente Groovy que es dinámico y no cómo Scala que es estático. ¿No te gustan o crees qué es difícil aprender uno de los dos? Puedes utilizar Java con Play! (en el caso web).

    Yo la verdad creo que Java es bueno para la web y para lo móvil (¿Android en qué se programa? 😉 …Para el escritorio creo que lo mejor es utilizar lo nativo, por ejemplo en Linux GTK o QT, para OS X no hay nada cómo Cocoa, para Windows pues lo habitual y así.

    Saludos.

  12. Avatar de Desconocido
    Anónimo permalink

    Yo estuve en un desarrollo web con tomcat, jboss, life ray y icefaces, me parece que es bastante complicado usar 2 servidores tomcat y jboss, y tantos frameworks para una aplicación, quisiera saber que tan lento es para un celular comparandolo con c++ en android por ejemplo.

  13. Avatar de Guillermo

    Les doy un ejemplo practico. En nuestra empresa tenemos un «viejo» sistema administrativo-contable en Cobol que funciona a la perfección. Los gerentes tienen la «idea» de cambiar por algo mas moderno que se vea mas lindo, a pesar de mi negativa rotunda, pero bue, ellos mandan. Trajeron a la empresa hasta el momento 8 sistemas administrativos contables hechos en java para prueba de empresas argentinas muy reconocidas. En el caso de querer usarlos a una velocidad respetable tenemos que cambiar el servidor (US$10.000) y todas las pc clientes (US$50.000) (ademas del switch y vaya saber cuantas cosas mas) ya que necesitan recursos y recursos y mas recursos. Los tildes son frecuentes. Yo no estoy a favor ni en contra de Java, pero esto es la realidad de lo que me ofrece java (o sus programadores) en estos momentos en Argentina.

  14. Avatar de pixie72
    pixie72 permalink

    La clave de Java no es su performance. Es su PORTABILIDAD.
    Si buscan hacer un juego evidentemente java no es el camino, si buscan hacer una suite de ofimatica tampoco. Ahora si lo que buscamos es construir un ERP que lo puedamos colocar tanto en una empresa que tiene win server, linux, ibm o lo que sea , bueno usemos java, hagamos código prolijo y no esperemos la maravilla de interfaz gráfica.

  15. Avatar de Carlos Alberto

    Yo solo usaría Java en un caso extremo de hambre y sed.

  16. Avatar de walter
    walter permalink

    reflote bestial pare decir:

    » Los desarrolladores pueden hacer un truño de aplicación, y cuando no funcione bien se encogerán de hombros y dirán: ‘qué quieres, no es culpa mía, ya sabes que Java es lento‘.»

    ¿¿ Como se explica entonces que cuando un programador no usa java optimiza más el código ??

Deja un comentario