miércoles, 30 de enero de 2013
Perl: How to take time to benchmark or profiling
#!/usr/bin/perl
#How to benchmark your Perl code?
#Example of how to take time for benchmark or profiling in Perl.
#Calcular el tiempo transcurrido entre lineas de codigo.
use strict;
use warnings;
########### EXAMPLE 1 ###########
#sample works for second intervals
my $start_ = time;
sleep rand(17)/3; #Job: or some other crazy pieces of code
my $end_ = time;
my $length = $end_ - $start_;
print "It took us $length seconds.\n";
#Out: It took us 3 seconds.
########### EXAMPLE 2 ###########
#Using Time::HiRes
#How can I get the time in milliseconds in Perl using Time::HiRes
use Time::HiRes qw/ time sleep gettimeofday tv_interval /;
my $start = time; #Returns a floating seconds since the epoch.
my $s1; #seconds since the epoch
my $usec1; #microsegundos
my $s2; #seconds since the epoch
my $usec2; #microsegundos
($s1, $usec1) = gettimeofday; # get seconds and microseconds since the epoch
sleep rand(17)/3; #Job: or some other crazy pieces of code
my $end = time; #Returns a floating seconds since the epoch.
# get seconds and microseconds since the epoch
($s2, $usec2) = gettimeofday; # get seconds and microseconds since the epoch
print 'Slept for ', ( $s2 - $s1 ) , " seconds \n";
print 'Slept for ', ( $usec2 - $usec1 ) , " micro-seconds \n";
print 'Slept for ', ( $end - $start ) , " floating seconds since the epoch \n";
print 'Slept for ', tv_interval ( [$s1, $usec1], [$s2, $usec2]), " floating seconds \n";
#Out: Slept for 1 seconds
#Out: Slept for -360540 micro-seconds
#Out: Slept for 0.639461040496826 floating seconds since the epoch
#Out: Slept for 0.63946 floating seconds
########### EXAMPLE 3 ###########
#Using Benchmark
use Benchmark;
my $t0 = new Benchmark;
sleep rand(17)/3; #Job: or some other crazy pieces of code
my $t1 = new Benchmark;
my $td = timestr(timediff($t1, $t0));
print "It took us : " . $td . "\n";
#Out: It took us : 2 wallclock secs ( 0.01 usr + 0.00 sys = 0.01 CPU)
########### EXAMPLE 4 ###########
#Using Benchmark::Timer
#Install it on ubuntu with: apt-get install libbenchmark-timer-perl
#Example of Benchmarking with statistical confidence.
use Benchmark::Timer;
my $t = Benchmark::Timer->new(skip => 0);
for(1 .. 4) {
$t->start('test_01');
sleep rand(17)/3; #Job: or some other crazy pieces of code
$t->stop('test_01');
}
print $t->report;
#Out: 4 trials of test_01 (10.204s total), 2.551s/trial
########### EXAMPLE 5 ###########
# Para comparar la prestancia entre dos métodos.
# Este es un script aparte:
#!/usr/bin/perl -w
use strict;
use warnings;
use Time::HiRes qw(time);
use Benchmark qw(:all) ;
my $msg = "mensaje";
#Start test
cmpthese($times, {
'method 1' => sub { function_1( 100 ) },
'method 2' => sub { function_2( 100 ) },
});
#End test
sub function_1 {
my $iterations = shift;
for (my $i = $iterations; $i >= 1; $i--) {
#Hace algo 1
print "Mensaje: $msg";
}
}
sub function_2 {
my $iterations = shift;
for (my $i = $iterations; $i >= 1; $i--) {
#Hace algo 2
print "Mensaje: $msg";
}
}
Reference:
- http://perldoc.perl.org/Time/HiRes.html
- http://perldoc.perl.org/Benchmark.html
- http://search.cpan.org/~dcoppit/Benchmark-Timer-0.7102/lib/Benchmark/Timer.pm
viernes, 18 de enero de 2013
Perl Thread and concurrence 1
1) Example of Perl Thread and concurrence:
#!/usr/bin/perl -w
# This is perl 5, version 14
# File name: thread_example_01.pl
use strict;
use Thread qw(:DEFAULT async yield);
my %hash = ( t3 => '', t2 => '', t1 => '', );
for my $key ( keys %hash ) {
$hash{$key} = Thread->new(\&doSomething, $key)->yield;
}
sleep(15);
print "Thread->list = " . Thread->list . "\n";
#Function concurrent
sub doSomething {
my $thread = shift;
print "thread $thread - start tid = " . Thread->self->tid . "\n";
sleep(3);
print "thread $thread - end tid = " . Thread->self->tid . "\n";
#yield();
}
Console out:
$ perl thread_example_01.pl
thread t3 - start tid = 1
thread t2 - start tid = 2
thread t1 - start tid = 3
thread t3 - end tid = 1
thread t2 - end tid = 2
thread t1 - end tid = 3
Thread->list = 3
Perl exited with active threads:
0 running and unjoined
3 finished and unjoined
0 running and detached
References:
viernes, 4 de enero de 2013
Perl: Mojolicious y Perl
Mojolicius es un framework que pretende facilitar la programación de aplicaciones web por medio de Perl. Utiliza el patrón MVC y soporta CGI, FastCGI y PSGI. De serie tiene soporte para rutas RESTful, extensiones, sesiones, cookies firmadas, servidor de ficheros estáticos, test unitarios, plantillas, JSON, I18N y Unicode. Entre las características más importantes de este framework están:
Framework que implementa la estructura MVC apoyado a través de Mojolicious:Lite
Crea una estructura de objetos muy limpia y que no requiere de nada especial, solo de la versión 5.8.1 de Perl.
Implementación de websocket cliente/servidor con Ipv6, TLS, IDNA, pipelining, chunking y soporte multipartes.
Soporte para CGI, FastCGI y PSGI.
Código fresco basado en años de experiencia.
Completa rutas con RESTful, plugins, sesiones, cookies firmadas, servidor de ficheros estáticos, framework de test, plantillas perl-ish, soporte para JSON, I18N y muchas más cosas.
Instalar Mojolicious on ubuntu linux
#1) Form one:
sudo apt-get install curl
curl get.mojolicio.us | sh
sudo apt-get install libmojolicious-perl
#2) Form two:
cpan Mojolicious
sudo apt-get install libmojolicious-perl
para desinstalar:
sudo apt-get remove libmojolicious-perl
sudo apt-get purge libmojolicious-perl
sudo apt-get clean libmojolicious-perl
#3) Install from CPAN:
perl -MCPAN -e shell
Terminal does not support AddHistory.
cpan shell -- CPAN exploration and modules installation (v1.960001)
Enter 'h' for help.
cpan[1]> install Mojolicious
...
...
Database was generated on Fri, 19 Apr 2013 06:07:13 GMT
Mojolicious is up to date (3.95).
Testing
#Crear un archivo first_test.pluse Mojolicious::Lite;
get '/' => {text => 'Hello World!'};
app->start;
#Ejecutar
morbo first_test.pl
Generate application
cd /home/user/
mojo generate app MyappAPI
/home/user/myapp_api$ ls
lib log public script t templates
script/myapp_api daemon
Server available at http://127.0.0.1:3000.
Put in browser:
http://127.0.0.1:3000
...and will be shown:
Welcome to the Mojolicious real-time web framework!
Install Rest Client:
Install RESTClient, a debugger for RESTful web services to Mozilla:
https://addons.mozilla.org/es/firefox/addon/restclient/
Referencias:
Mojolicious web site.
Introduction to Mojolicious-Perl.
Suscribirse a:
Entradas (Atom)