• Publicidad

Qué opinan de esta comparacion de velocidad: Perl vs otros

¿Tienes algo interesante que decir? ¿O quizá algo no tan interesante? Aquí tenemos un espacio para compartir todo lo que queramos decir y que no cabe en ninguno de los otros foros.

Qué opinan de esta comparacion de velocidad: Perl vs otros

Notapor danimera » 2013-05-30 20:36 @900

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:

http://www.utnianos.com.ar/foro/tema-c-perl-java-python-ruby-php-qui%C3%A9n-es-m%C3%A1s-veloz
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Publicidad

Re: Qué opinan de esta comparacion de velocidad: Perl vs otr

Notapor explorer » 2013-05-31 10:03 @460

Hubiera quedado mejor como se indica aquí.

Mucho más interesante es hacerlo de forma recursiva, siguiendo la definición de la serie:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.16;
  3.  
  4. sub fib {
  5.     my $n = $_[0];
  6.  
  7.     if ($n == 1  or  $n == 0) {
  8.         return $n;
  9.     }
  10.     else {
  11.         return fib($n - 1) + fib($n - 2);        # Un número de la serie es igual a la suma de los dos anteriores
  12.     }
  13. }
  14.  
  15. say fib(34);
  16.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Calcular el número de Fibonnaci que está en la posición 34 me tarda con mi ordenador unos 16 segundos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
> time ./kk.pl
5702887

real    0m27.602s
user    0m16.006s
sys     0m0.120s
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Y los tiempos aumentan de forma logarítmica para cada número superior.

Eso es debido a que se calcula varias veces el mismo número de la secuencia.

Por ejemplo, para calcular

fib(5), se debe calcular el valor de

fib(4)+fib(3), que se traduce en calcular

fib(3)+fib(2)+fib(2)+fib(1), que a su vez se traduce en

fib(2)+fib(1)+fib(1)+fib(0)+fib(1)+fib(0)+1, con lo que queda en

fib(1)+fib(0)+1+1+0+1+0+1 = 1+0+1+1+0+1+1 = 5

Vemos que hemos tenido que calcular varias veces el mismo número (fib(3), dos veces).

Éste ejemplo sí que puede servir para medir el rendimiento de los distintos lenguajes, aunque solo para ver la velocidad de cálculo (y no otras cosas).

Y es aquí donde se demuestra la potencia de Perl: basta unos pequeños cambios...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use Memoize;
  2. memoize('fib');
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

y ahora las prestaciones cambian extraordinariamente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
> time ./kk.pl
5702887

real    0m0.423s
user    0m0.124s
sys     0m0.016s
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

¡¡Un poco más de una décima de segundo!!

Gracias a la ayuda del módulo Memoize (incluido con la distribución principal), vamos recordando los valores de la secuencia, con lo que solo se calculan una vez.

Finalmente, para calcular igual a como lo indica el artículo enlazado, se pueden seguir las recomendaciones del enlace que puse antes:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.16;
  3.  
  4. sub fib {
  5.     my $n = $_[0];
  6.  
  7.     return $n == 0 ? 0 : fib2($n, 0, 1);
  8. }
  9.  
  10. sub fib2 {
  11.     my($n, $p0, $p1) = @_;
  12.  
  13.     if ($n == 1) {
  14.         print "$p1\n";
  15.     }
  16.     else {
  17.         my $p2 = $p0 + $p1;
  18.         print "$p2 ";
  19.         fib2($n - 1, $p1, $p2);
  20.     }
  21. }
  22.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Esta forma de calcular sigue la misma idea del autor del artículo enlazado: calculamos el siguiente número de la secuencia, sabiendo ya los dos anteriores. Y separando el caso especial del cálculo de 0. Y los tiempos de ejecución son igual de buenos. Por eso para medir las prestaciones de un lenguaje es interesante que los programas hagan muchos cálculos y operaciones diversas, y repetirlo muchas veces.

También, no quedaría completo el análisis, si dejáramos fuera los tiempos de compilación, los tiempos de desarrollo, memoria consumida, número de líneas...

The Computer Language Benchmarks Game

Artículo (en inglés) Análisis gráfico de prestaciones (velocidad, consumo de recursos)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Pasando el rato

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados