• Publicidad

Tiempo que dura la ejecución de un script en hh:mm:ss

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Tiempo que dura la ejecución de un script en hh:mm:ss

Notapor neodani » 2013-05-08 01:21 @098

Buenas,

Soy usuario de Linux y hasta ahora para saber el tiempo de ejecución de un script usaba el propio comando time, pero encontré una forma en perl de poderlo ver y tratar mejor.

El problema es que solo me muestra la cantidad de tiempo en segundos. ¿Se puede conseguir alguna forma de que aparezca en formato hh:mm:ss el tiempo de ejecución?

Ejemplo del script:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use Time::HiRes qw( time );
  2.  
  3. my $start = time();
  4. system("sleep 155"); # Comando
  5.  
  6. my $end = time();
  7. printf("%.2f\n", $end - $start);
  8.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


¡Muchas gracias de antemano!
neodani
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2013-05-08 01:14 @093

Publicidad

Re: Tiempo que dura la ejecución de un script en hh:mm:ss

Notapor explorer » 2013-05-08 06:33 @314

Bienvenido a los foros de Perl en Español, neodani.

La forma más rápida es usando el módulo Time::Seconds (incluido de base con la distribución Perl):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use Time::HiRes qw( time );
  2. use Time::Seconds;
  3.  
  4. my $start = time();
  5. system("sleep 155");  # Comando
  6.  
  7. my $end = time();
  8.  
  9. my $diff = Time::Seconds->new($end - $start);
  10. print $diff->pretty;  # Salida: 39 days, 23 hours, 17 minutes, 39 seconds
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
El problema es... que sale en inglés ;)

Otra forma de hacerlo es formatearlo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use Time::HiRes qw( time );
  2. use Time::Seconds;
  3.  
  4. my $start = time();
  5. system("sleep 155");  # Comando
  6.  
  7. my $end = time();
  8.  
  9. my $s = Time::Seconds->new($end - $start);
  10. my $h = int  $s->hours;
  11. $s   -= $h * $s->ONE_HOUR;
  12. my $m = int  $s->minutes;
  13. $s   -= $m * $s->ONE_MINUTE;
  14.  
  15. printf "%02d:%02d:%02d\n", $h, $m, $s;      # 23:59:59
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Naturlmente, se puede hacer sin módulos... solo hay que dividir, restar...

También se puede usar un módulo como DateTime, pero es cargar un montón de líneas para hacer algo que es muy sencillo...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Tiempo que dura la ejecución de un script en hh:mm:ss

Notapor neodani » 2013-05-08 14:59 @666

¡Gracias!

Probé ambas formas, y la segunda me funcionó sin problemas.
Sin embargo, cuando ejecuto la primera me dice que no encuentra el método pretty() :S

Can't locate object method "pretty" via package "Time::Seconds" at ./twitter5.pl line 12.

¿Me falta importar alguna otra librería?

Muchas gracias de antemano.
neodani
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2013-05-08 01:14 @093

Re: Tiempo que dura la ejecución de un script en hh:mm:ss

Notapor explorer » 2013-05-08 15:38 @693

Podría ser... que tuvieras un Time::Seconds viejo. ¿Qué versión de Perl estás usando?

Esto me funciona desde la línea de comandos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. $ perl -MTime::Seconds -E '$v = Time::Seconds->new(3453459); say $v->pretty'
  2. 39 days, 23 hours, 17 minutes, 39 seconds
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Puedes hacer una cosa: localiza el archivo Time/Seconds.pm En mi ordenador está en
/usr/lib/perl5/5.16.2/i586-linux-thread-multi/Time/Seconds.pm
/usr/lib/perl5/5.16.2/x86_64-linux-thread-multi/Time/Seconds.pm

y ahora lo abres y miras a ver si encuentras esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub pretty {
  2.     my $s = shift;
  3.     my $str = "";
  4.     if ($s < 0) {
  5.         $s = -$s;
  6.         $str = "minus ";
  7.     }
  8.     if ($s >= ONE_MINUTE) {
  9.         if ($s >= ONE_HOUR) {
  10.             if ($s >= ONE_DAY) {
  11.                 my $days = sprintf("%d", $s->days); # does a "floor"
  12.                 $str = $days . " days, ";
  13.                 $s -= ($days * ONE_DAY);
  14.             }
  15.             my $hours = sprintf("%d", $s->hours);
  16.             $str .= $hours . " hours, ";
  17.             $s -= ($hours * ONE_HOUR);
  18.         }
  19.         my $mins = sprintf("%d", $s->minutes);
  20.         $str .= $mins . " minutes, ";
  21.         $s -= ($mins * ONE_MINUTE);
  22.     }
  23.     $str .= $s->seconds . " seconds";
  24.     return $str;
  25. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Y si no está, pues lo agregas :)

O actualizas a un Perl más moderno, si puedes.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Tiempo que dura la ejecución de un script en hh:mm:ss

Notapor neodani » 2013-05-08 16:23 @724

Se resiste el pretty.

Tengo la versión más actual de mi versión de debian 6.0
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
This is perl, v5.10.1 (*) built for x86_64-linux-gnu-thread-multi
(with 59 registered patches, see perl -V for more detail)

apt-cache show perl | head
Package: perl
Priority: standard
Section: perl
Installed-Size: 17932
Maintainer: Niko Tyni <[email protected]>
Architecture: amd64
Version: 5.10.1-17squeeze5
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Probé metiendo esa subrutina en el módulo que decías pero sigue dándome el mismo error.

No sé si puedo actualizar perl desde repositorios... creo que tengo la última, aunque veo que tu usas la 5.16, ¿no?

Gracias.
neodani
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2013-05-08 01:14 @093

Re: Tiempo que dura la ejecución de un script en hh:mm:ss

Notapor explorer » 2013-05-08 16:38 @735

Según el archivo de cambios de Time::Piece, pretty() fue añadido a Time::Seconds en la versión 1.20 del día 17 de marzo del 2010, y tu versión de Perl es del 23 de agosto del 2009, así que deberías tenerlo actualizado.

Yo también tengo una debian v6.0.5, con Perl v5.14.2, y la orden

perl -MTime::Seconds -E '$v = Time::Seconds->new(3453459); say $v->pretty'

funciona.

Yo intentaría instalar la última versión de Time::Seconds, con la orden:

apt-get install libtime-piece-perl

Y si no... seguro que tardas mucho menos si pones las seis líneas de código necesarias para calcular las horas, minutos y segundos.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Tiempo que dura la ejecución de un script en hh:mm:ss

Notapor neodani » 2013-05-08 16:57 @747

¡Buenas!

La orden de actualizar apt-get install libtime-piece-perl funcionó bien, ya pude ejecutar el comando de ejemplo sin problemas:

[root@web-01 panel]# perl -MTime::Seconds -E '$v = Time::Seconds->new(3453459); say $v->pretty'
39 days, 23 hours, 17 minutes, 39 seconds


Lo que no entiendo es por qué no me formatea el texto. Me confirmas si no es mucha molestia que a ti te formatea bien los segundos, cogiendo el ejemplo del script.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. use Time::HiRes qw( time );
  4. use Time::Seconds;
  5.  
  6. my $start = time();
  7. system("sleep 5");  # Comando
  8.  
  9. my $end = time();
  10.  
  11. my $diff = Time::Seconds->new($end - $start);
  12. print $diff->pretty;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Resultado:
5.00158381462097 seconds

P.D.: Es cierto que con el otro ejemplo conseguimos el resultado, pero somos cabezones y que a ti te funcione y a mi no me encabezona más :D

Otro dato: puse 90 en el sleep() y el resultado fue casi molón, no sé por qué afina tanto los segundos...

1 minutes, 30.0016720294952 seconds

Saludos
neodani
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2013-05-08 01:14 @093

Re: Tiempo que dura la ejecución de un script en hh:mm:ss

Notapor explorer » 2013-05-08 20:57 @914

Esos decimales salen porque estás usando el módulo Time::HiRes:

> perl -MTime::HiRes=time -E 'say time'
1368064429.92237
> perl -E 'say time'
1368064435


Eres tu quien pide esa precisión :)

Luego, en el método pretty(), fíjate que hay llamadas a sprintf() (líneas 11, 15 y 19) para formatear a enteros las cantidades de los días, horas y minutos, pero no los segundos, porque él supone que está trabajando con segundos "enteros".
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Tiempo que dura la ejecución de un script en hh:mm:ss

Notapor neodani » 2013-05-09 01:07 @088

Entendido, muchas gracias por tu ayuda ;)
neodani
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2013-05-08 01:14 @093


Volver a Básico

¿Quién está conectado?

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

cron