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.
Aunque no era el foco principal, este código tiene otros issues importantes:
Como lecciones importantes tengo :
- Nunca midas performance con println
- El I/O domina el rendimiento
- No culpes al lenguaje o al OS sin aislar variables
- Linux suele tener mejor rendimiento de consola
