Análisis de efectividad en lenguajes de programación.
Últimamente me ha dado por realizar pequeñas prácticas que hace mucho realicé como parte de mi descubrimiento en algunos lenguajes de programación. He leído mucho respecto a los sabores y performance de cada lenguaje, cuyos argumentos no trataré por ser sumamente objetivos. Algunos valoran la facilidad, otros la poca verborrea que facilitan la construcción de complejos componentes de software.
A continuación expongo los códigos comparados y las salidas en terminal.
Características de la computadora.
- CPU: 2 CPUs con 2 Cores AMD Turion(tm) 64 X2 Mobile Technology TL-60 a 1800.000 Mhz.
- Memoria RAM: 3.7G
- Sistema Operativo: Fedora release 20 (Heisenbug)
Versiones de compiladores/interpretes
- Python: 2.7
- C: gcc version 4.8.3 20140911 (Red Hat 4.8.3-7) (GCC)
- Java: 1.7 hotspot a 64 bits
- Ruby: 2.0
- Go: 1.4.2 64 bits
Python
print (my_range)
Tiempo de ejecución
real 10m24.691s
user 2m23.193s
sys 0m7.727s
C
int i = 0;
for(i=0;i<=90000000;i++) {
printf("%d\n",i);
}
Tiempo de ejecución
real 0m28.385s
user 0m19.777s
sys 0m2.499s
Java
int i = 0;
for (i=0;i<=90000000;i++) {
System.out.println(i);
Tiempo de ejecución
real 17m22.300s
user 5m37.142s
sys 11m21.516s
Ruby
for i in 0..90000000
puts "#{i}"
end
Tiempo de ejecución
real 2m56.731s
user 2m47.771s
sys 0m4.091s
Go
for i:=0;i<=90000000;i++ {
fmt.Println(i);
}
Tiempo de ejecución
real 8m22.270s
user 2m33.143s
sys 5m46.353s
Conclusión
Para simplificar las comparativas utilicé una escala en segundos y grafiqué los resultados.
Real
Este refleja el total de tiempo (cronómetro) que tardó la ejecución del programa.
System
Tiempo de CPU en modo kernel (syscalls) que utilizó el programa.
User
Análogo al anterior, solo que en modo usuario.
Nota: Los tiempos de usuario y kernel, sumados, no son precisamente el tiempo real de ejecución, esto es debido a los diferentes estados que transita un proceso (como las esperas).
Resultado
- Como podíamos esperar, Java en los 3 tiempos fue el más lento, por el otro lado, C siempre fue el más eficiente.
- Python es más lento que Ruby y Go hablando del tiempo real.
- Ruby ocupa más tiempo de procesador en modo usuario que Python y Go (virtualmente empatados).
- Go ocupa más tiempo en modo kernel que Python y Ruby.
Nota: Como pueden ver, los números no corresponden de la mejor manera, ya que hay un sesgo que tenemos que quitar de la mesa. La ejecución de cualquier syscall (modo kernel) siempre será más lenta que la ejecución de código en modo usuario, debido a los registros que se cargan y descargan en el CPU y las validaciones de seguridad.
Para quitar ese sesgo (sabemos que el planificador de procesos de GNU/Linux no es tan preciso como para permitirnos medir de la manera menos arbitraría) hice una sumatoria de los tiempos de usuario y kernel, eliminando las 'esperas'.
Con esta nueva comparativa vemos que en primer lugar, el lenguaje que más tiempo de CPU consume es Java, seguido por Go. Ruby y Python son muy cercanos, pero aún así, lejanos al rey de la eficiencia, es decir, C.
Comentarios
Publicar un comentario