UTNianos

Versión completa: C, Perl, Java, Python, Ruby, PHP ¿quién es más veloz?
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Esta mañana estaba algo aburrido y se me ocurrió hacer un experimento: comparar la velocidad a la que se ejecuta un mismo algoritmo en diversos lenguajes de programación. Para ello, hice un pequeño algoritmo que imprime parte de la serie de Fibonacci, en los siguientes lenguajes:

En C. Archivo: foo.c
Cita:#include <stdio.h>

foo(int a, int b) {
if (a + b > 0) printf("%i ", a + b);
if (a + b < 100000000) foo(b, a + b);
}

main() {
foo(-1, 1);
printf("\n");
}
En Java. Archivo: Foo.java
Cita:public class Foo {

public static void main(String[] args) {
Foo f = new Foo();
f.foo(-1, 1);
System.out.print("\n");
}

public void foo(int a, int b) {
if (a + b > 0) { System.out.print(a + b + " "); }
if (a + b < 100000000) { this.foo(b, a + b); }
}

}

En Perl. Archivo: foo.pl
Cita:#!/usr/bin/perl

sub foo {
($a, $b) = @_;
if($a + $b > 0) { print $a + $b . " "; }
if($a + $b < 100000000) { foo($b, $a + $b); }
}

foo(-1, 1);
print "\n";


En Python. Archivo: foo.py
Cita:#!/usr/bin/python
from sys import stdout


def foo(a, b):
if a + b > 0:
stdout.write("%i " % (a + b))
if a + b < 100000000:
foo(b, a + b)


foo(-1, 1)
print ""


En PHP. Archivo: foo.php
Cita:#!/usr/bin/php
<?php

function foo($a, $b) {
if($a + $b > 0) print $a + $b . " ";
if($a + $b < 100000000) foo($b, $a + $b);
}

foo(-1, 1);
print chr(10);

?>


En Ruby. Archivo: foo.rb

Cita:#!/usr/bin/ruby


def foo(a, b)
if (a + b) > 0
print a + b , " "
end

if (a + b) < 100000000
foo(b, a + b)
end
end

foo(-1, 1)
puts " "


Exceptuando los archivos en C y Java que deberán ser compilados (ver más adelante), al resto de los archivos les asigné permisos de ejecución para que sea más cómodo correrlos:

Cita:chmod +x foo.php foo.py foo.pl foo.rb

Y a continuación, me dediqué primero, a comparar la velocidad de compilación entre Java y C y obtuve estos resultados:

Tiempo de compilación en C:

Cita:time gcc foo.c -o fooc

real 0m1.970s
user 0m0.028s
sys 0m0.048s

Tiempo de compilación en Java:

Cita:time javac Foo.java

real 0m3.769s
user 0m0.816s
sys 0m0.100s

Se podría decir que la compilación en C, tardó (más o menos) la mitad del tiempo que la compilación en Java.

Finalmente ejecuté cada uno de los micro-programas, dos veces cada uno: la primera, para que se cachearan y la segunda, para comparar la diferencia en la velocidad de ejecución y ésto, fue lo que obtuve:

Tiempo de ejecución en C: 0.002 segundos

Cita:XXXXX@XXXX:~$ time ./fooc
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181
6765 10946 17711 28657 46368 75025 121393 196418 317811
514229 832040 1346269 2178309 3524578 5702887 9227465
14930352 24157817 39088169 63245986 102334155

real 0m0.002s
user 0m0.000s
sys 0m0.000s

Tiempo de ejecución en Java: 0.143 segundos

Cita:XXXXX@XXXX:~$ time java Foo
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181
6765 10946 17711 28657 46368 75025 121393 196418 317811
514229 832040 1346269 2178309 3524578 5702887 9227465
14930352 24157817 39088169 63245986 102334155

real 0m0.143s
user 0m0.112s
sys 0m0.028s

Tiempo de ejecución en Perl: 0.003 segundos

Cita:XXXXX@XXXX:~$ time ./foo.pl
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181
6765 10946 17711 28657 46368 75025 121393 196418 317811
514229 832040 1346269 2178309 3524578 5702887 9227465
14930352 24157817 39088169 63245986 102334155

real 0m0.003s
user 0m0.000s
sys 0m0.000s

Tiempo de ejecución en Python: 0.038 segundos

Cita:XXXXX@XXXX:~$ time ./foo.py
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181
6765 10946 17711 28657 46368 75025 121393 196418 317811
514229 832040 1346269 2178309 3524578 5702887 9227465
14930352 24157817 39088169 63245986 102334155

real 0m0.038s
user 0m0.024s
sys 0m0.012s

Tiempo de ejecución en PHP: 0.027 segundos

Cita:XXXXX@XXXX:~$ time ./foo.php
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181
6765 10946 17711 28657 46368 75025 121393 196418 317811
514229 832040 1346269 2178309 3524578 5702887 9227465
14930352 24157817 39088169 63245986 102334155

real 0m0.027s
user 0m0.020s
sys 0m0.004s

Tiempo de ejecución en Ruby: 0.009 segundos

Cita:XXXXX@XXXX:~$ time ./foo.rb
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181
6765 10946 17711 28657 46368 75025 121393 196418 317811
514229 832040 1346269 2178309 3524578 5702887 9227465
14930352 24157817 39088169 63245986 102334155

real 0m0.009s
user 0m0.004s
sys 0m0.004s

Si se tratara de una carrera de autos la tabla de posiciones sería como la siguiente:

Cita:================================================
Turismo Compilación
================================================
Primer puesto: C
Segundo puesto: Java

================================================
Turismo Ejecución
================================================

PUESTO PILOTO TIEMPO (en segundos)
------------------------------------------------
1º C 0.002
2º Perl 0.003
3º Ruby 0.009 ¡Nuevo competidor!

4º PHP 0.027
5º Python 0.038

6º Java 0.143

Es decir que PHP demoró 13.5 veces más que C; Python, 12.6 veces más que Perl y Java... mejor no lo comparo con ninguno.

Fuente:
Spoiler: Mostrar
debianhackers.net

Acerca de eugeniabahit

Arquitecta de Software. Analista Programadora GLAMP y Agile Coach. Perfil completo en: http://www.debianhackers.net/autores-en-...enia-bahit
era evidente que C iba a ser mas rapido que los otros


igual todo depende del algoritmo que hagas (es decir, de la tarea que se esta procesando), asique no lo tomes como verdad absoluta que ese es el orden de velocidades de los lenguajes =P (igual si, php es mas lento que los otros jaja)
Hola soy nuevo en algoritmo me podrian dar una referencia como es lo que va esta materia, digo esto ya que no tube ninguna experiencia programando unos amigos me aconsejaron iniciar con free pascal
interesante... me acuerdo de cuando buscaba probar el "20000 factorial": http://www.utnianos.com.ar/foro/tema-20000-factorial



| funcion inicio fin |
inicio := Time millisecondClockValue.
funcion := [:a :b :fx | (a+b) > 0 ifTrue:[Transcript show: (a+b) printString; space]. (a+b) < 100000000 ifTrue: [fx value: b value: (a+b) value: fx]].
funcion value: -1 value: 1 value: funcion.
fin := Time millisecondClockValue.
Transcript cr; show: '- Tiempo: ' , (fin - inicio) printString , ' (ms)'.


(17-04-2013 00:32)farragan escribió: [ -> ]Hola soy nuevo en algoritmo me podrian dar una referencia como es lo que va esta materia, digo esto ya que no tube ninguna experiencia programando unos amigos me aconsejaron iniciar con free pascal

te recomiendo mirar el subforo de sistemas
Pregunto, que el codigo en C lo hayas compilado, no hace que tenga ventaja sobre los otros que son interpretados? En el turismo ejecución digo...

Off-topic:
cuando vi el titulo del thread, te juro que me imaginé que iba a aparecer leatex a mostrar el "xxx factorial" de smalltalk
(17-04-2013 09:19)jonifanaderiver escribió: [ -> ]Pregunto, que el codigo en C lo hayas compilado, no hace que tenga ventaja sobre los otros que son interpretados? En el turismo ejecución digo...

Estaba pensando lo mismo, fijate que los lenguajes que tienen construido el binario final siempre son mas rapidos, pero si nos ponemos a pensar, la idea de java es justamente esa jejeje, por ahi comer mas recursos y ser un poco mas lento, pero hacerlo mas "multiplataforma"

despues estaria bueno si con la misma maquina haces en mono =) asi se compara java con mono sobre linux =D

Lindo laburito, esta copado hacer estas cosas!!!

+10 =P
URLs de referencia