¿Es NIO realmente más rápida que IO?
Paul Tyma ha publicado en su weblog el resultado de un micro benchmark donde compara el rendimiento de la API no bloqueante NIO con la más tradicional y bloqueante API IO. La primera, una incorporación de Java 1.4, supuestamente debería proporcionar un incremento en el rendimiento al permitir lecturas y escrituras no bloqueantes; esto permite atender más peticiones con un número menor de threads ya que cada thread puede trabajar sobre múltiples canales (channels) de entrada e ir "saltando" de uno a otro según tenga datos disponible en cada momento.
Con el API IO las lecturas y escrituras son bloqueantes y el thread que realiza la operación de lectura o escritura se bloquea hasta que ésta termina, no pudiendo ser empleado en sus tiempos muertos para atender otras peticiones, lo que obliga a tener un número mayor de threads.
Los resultados que Paul Tyma obtiene son justo los contrarios a los esperados; él ha creado un pequeño servidor que responde a peticiones de un montón de clientes y ha obtenido mejor rendimiento en todos los campos empleando el API IO.
No obstante, sus test tienen un pequeño truco: ha empleado una máquina Linux con kernel 2.6.5 y con soporte para threads NPTL, incorporados en la versión 2.6.4 (creo recordar) del kernel y que presentan un rendimiento muy superior a los threads que tradicionalmente ha empleado Linux.
Aunque yo no creo que de sus resultados pueda concluirse que NIO es más eficiente que IO (además, el sólo ha medido métricas relativas a la red, no accesos al disco) sí es una buena prueba de que a veces las máquinas virtuales no están "al día" con los sistemas operativos: estoy convencido de que la máquina virtual que empleaba asumía que se usarían los threads tradicionales de Linux y no los NPTL; si se construyese una máquina virtual optimizada para estos threads seguramente los resultados de los test serían los esperados.
¿Qué opináis vosotros al respecto?
Reader Comments