Banco de Pruebas (I): Velocidad

Hace tiempo hice algo parecido con los lenguajes de programación que entonces conocía, probando aquellos que eran de scripting, compilados y probando sobretodo, lo que tardan en levantar y hacer una operación tan simple como enumerar 100.000 números sacando por pantalla el número con un elevado a 2 de la posición en el que sale la impresión. Por ejemplo:

Hola 1
Hola 4
Hola 9
Hola 16
...

He realizado las pruebas en los lenguajes: C, Perl, Ruby, Python, PHP, Lua, Shell script, Erlang script y Java.

C

En lenguaje C se ha realizado el siguiente código:

#include <stdio.h>
 
main() {
        int i;
 
        for (i=; i<100000; i++) {
                printf("Hola %d\n", i*i);
        }
}

Perl

En el lenguaje Perl, se ha implementado el código siguiente:

#!/usr/bin/perl
 
for ($i=; $i<100000; $i++) {
        print "Hola " . ($i*$i) . "\n";
}

Ruby

En Ruby, el código escrito ha sido:

#!/usr/bin/ruby
 
(1..100000).each do |i|
        puts "hola " + (i*i).to_s
end

Python

En Python, el código ha sido:

#!/usr/bin/python
 
for i in range(1,1000000):
        print "Hola " + str(i*i)

PHP

En PHP el código escrito ha sido:

#!/usr/bin/php -q
<?php
 
for ($i=; $i<100000; $i++) {
        print "Hola " . ($i*$i) . "\n";
}

Lua

El código de Lua escrito ha sido:

#!/usr/bin/lua
 
for i=1,100000 do
        print("Hola " .. (i*i))
end

Shell script

En shell script (en bash) se ha implementado lo siguiente:

#!/bin/bash
 
for i in $(seq 1 100000); do
        let RESULT=$i*$i
        echo "Hola $RESULT"
done

Erlang (Script)

Erlang también puede emplearse como lenguaje de scripting usando el intérprete escript. El código escrito para este intérprete ha sido:

#!/usr/bin/escript
 
main(_Args) ->
        loop(100000).
 
loop() -> ;
loop(I) ->
        io:format("Hola ~p~n", [I*I]),
        loop(I-1).

Java

El código que se ha usado para la prueba de Java ha sido:

public class loop {
        public static void main( final String[] args ) {
                for (int i=; i<100000; i++) {
                        System.out.println("Hola " + (i*i));
                }
        }
}

Resultado de las pruebas

Tras ejecutar 5 veces cada script, controlando el tiempo que toma cada uno hemos obtenido, según el equipo en el que se ha ejecutado. El equipo 1 es un Intel vPro con Debian GNU/Linux Lenny:

Lenguaje Ejecuciones (en segundos) (Equipo 1)
1 2 3 4 5
C (4.1.3) 0,02 0,02 0,02 0,02 0,02
Perl (5.10.0) 0,04 0,03 0,03 0,03 0,03
Ruby (1.8.7-p72) 0,16 0,15 0,16 0,16 0,15
Lua (5.1.3) 0,21 0,22 0,21 0,21 0,21
PHP (5.3.1) 0,41 0,47 0,43 0,33 0,29
Python (2.6.5) 1,13 1,11 1,15 1,16 1,14
Java (1.6.0_20-b02) 1,37 1,39 1,40 1,36 1,34
Erlang (R13B04, 5.7.5) 3,65 3,62 3,65 3,65 3,56
Bash (3.2.39) 7,27 7,26 7,46 7,40 7,25

En el equipo 2, un Apple iBook G4 (PowerPC):

Lenguaje Ejecuciones (en segundos) (Equipo 2)
1 2 3 4 5
C (4.0.1) 0,22 0,34 0,55 0,32 0,35
Perl (5.8.9) 0,67 0,83 0,68 0,68 0,78
Ruby (1.8.6-p386) 2,91 3,21 3,20 3,13 3,52
Lua (5.1.4) 1,51 1,64 1,64 1,65 2,43
PHP (5.2.14) 2,51 2,48 2,55 2,37 2,77
Python (2.5.1) 17,49 16,91 17,41 17,40 16,92
Java (1.5.0_26-156) 7,60 5,92 5,72 5,90 6,02
Erlang (R14A, 5.8) 22,10 23,13 22,76 21,94 21,80
Bash (4.1.9) 135,19 223,56 181,40 136,19 133,46

Ordenados por velocidad, se ve que el lenguaje C, como cabía esperar, es el más rápido, seguido de Perl, como el lenguaje de scripting más rápido.