Translate

jueves, 2 de abril de 2026

GraalVM vs GraalOS vs Containers vs Unikernels


En los últimos años aparecieron múltiples formas de ejecutar aplicaciones:

  • GraalVM
  • GraalOS
  • Containers como Docker
  • Y el concepto de Unikernel


Todas apuntan a lo mismo: Ejecutar software de forma más eficiente, portable y segura

Pero no compiten exactamente en el mismo nivel


Antes de comparar, entendamos esto:


| Tecnología | Nivel                          |

| ---------- | ------------------------------ |

| GraalVM    | Runtime / compilación          |

| GraalOS    | Sistema operativo experimental |

| Containers | Empaquetado y ejecución        |

| Unikernels | Arquitectura de sistema        |


Un error común es compararlas como si fueran alternativas directas. En realidad, muchas se pueden combinar.


GraalVM es un runtime avanzado que permite:

  • Ejecutar múltiples lenguajes
  • Compilar a binarios nativos (Native Image)


Ventajas

  • Arranque ultrarrápido
  • Menor consumo de memoria
  • Ideal para microservicios


Limitaciones

  • Problemas con reflection Complejidad operativa



GraalOS intenta combinar:

GraalVM + filosofía unikernel


Es decir:

  • Apps compiladas como native image
  • Ejecutándose sobre un OS mínimo


Estado actual:

  • Experimental
  • Sin adopción masiva
  • Poco foco en los últimos años


Hoy el mundo real es claro:

  • Docker domina el deploy
  • GraalVM optimiza ejecución
  • Unikernel es prometedor pero nicho
  • GraalOS es más idea que realidad :(


miércoles, 1 de abril de 2026

Rendimiento de Consola: Linux vs Windows (¿realmente uno es más rápido?)


Hace poco me encontré con un comportamiento curioso ejecutando el siguiente código en Java:


var lista = new LinkedList<Long>();

for (var i = 0L; i < Long.MAX_VALUE; i++) {

    System.out.println(i);

    lista.add(i);

}


En Linux corría muchísimo más rápido que en Windows.


La primera reacción fue: ¿La JVM es más rápida en Linux?

Pero la respuesta es: no necesariamente.


El problema no está en Java ni en la lógica del programa. Está en: System.out.println(i);


Cada println implica:

  • Sincronización interna (thread-safe)
  • Conversión a string
  • Llamada al sistema operativo (I/O)
  • Escritura en la consola


Windows (cmd / PowerShell)

  • Consola históricamente más lenta
  • Mayor overhead en escritura
  • Menor eficiencia en buffering
  • Renderizado de texto menos optimizado


🐧 Linux (terminal)

  • Mejor manejo de buffers
  • I/O más eficiente
  • Consolas más livianas (bash, zsh, tty)
  • Mejor throughput de escritura


Si sacamos el println anda muy rápido :


var lista = new LinkedList<Long>();

for (var i = 0L; i < 10_000_000; i++) {

    lista.add(i);

}


El cuello de botella era la consola, no el sistema operativo.


Como lecciones importantes tengo :

  1. Nunca midas performance con println
  2. El I/O domina el rendimiento
  3. No culpes al lenguaje o al OS sin aislar variables
  4. Linux suele tener mejor rendimiento de consola