El 17/02/11 18:38, deibyz escribió:
A las buenas tardes,

Estoy volviendo a pasar por esa fase de la vida en la que decides que es una 
buena idea sacar estadísticas de unos logs con mogollón de líneas. Uno, que 
siempre recae en los clásicos.

La cosa está en que esta vez son *muchas* líneas y, entre otras cosas, tengo 
que calcular diferencias de tiempos. Como siempre, en vez de tener un timestamp 
tengo una fecha en un formato tal que %Y%m%d%H%M%S%X (siendo %X diezmilésimas 
de segundo).

El problema es que mi parseador se pasa cerca de 1/3 del tiempo en la sub 
date2epoch, que me devuelve los segundos (con precisión de diezmilésimas) del 
timestamp.

Después de unos cuantos benckmarks (usando DateTime, POSIX::strptime, etc...), lo que 
mejor resultado me está dando es tirar directamente de POSIX::mktime partiendo "a 
mano" la fecha, tal que así:

sub _date2epoch {
     my $self = shift;
     my $stamp = shift;
     my ( $nano, @time ) = reverse unpack "A4A2A2A2A2A2A4", $stamp;
     $time[5] -= 1900;
     $time[4] -= 1;
     return ( mktime(@time) + $nano );
}

Pero todavía se me queda muy corto de rendimiento... Alguna idea mágica de cómo 
hacerlo más rápido todavía?


(no probado)

use Memoize;

memoize(_date2epoch);

my($local_nano, @local_time);

sub _date2epoch {
    ($local_nano, @local_time ) = reverse unpack "A4A2A2A2A2A2A4", $_[1];

    $local_time[4] -= 1;
    $local_time[5] -= 1900;

    return ( mktime(@local_time) + $local_nano );
}


--
JF^D
_______________________________________________
Madrid-pm mailing list
[email protected]
http://mail.pm.org/mailman/listinfo/madrid-pm

Responder a