#!/usr/bin/perl -w
# Costruisce una struttura dati a partire dal file di log.
# La struttura consiste in un hash, indicizzato ai comandi eseguiti.
# Ogni entry dell'hash contiene un array, ogni voce del quale contiene
# il tempo a cui è stato invocato il comando, e il tempo richiesto
# per l'esecuzione del comando.

use strict;
$|=1;

my $LOGFILE=$ARGV[0];
my %results;

open LOG, $LOGFILE;
while ( <LOG> ) {
  SWITCH: {
      if ( /^#/ ) {
	   last SWITCH;
       }
      else {
	  chomp $_;
	  if ( ! exists $results{substr($_,0,(rindex $_," "))} ) {
	      $results{substr($_,0,(rindex $_," "))}=[];
	  }
      }
  }
}
close LOG;

foreach ( keys %results ) {
    my $command = $_;
    my $timestamp;
    open LOG, $LOGFILE;
    while ( <LOG> ) {
      SWITCH: {
	  if ( /^#/ ) {
	       s/#//g;
	       $timestamp = $_;
	       chomp $timestamp;
	       last SWITCH;
	   }	
	  if ( /^\Q$command\E/ ) {
	      chomp $_;
	      my $delay=substr($_,(rindex $_," ")+1);
	      push @{$results{$command}}, [ $timestamp, $delay ];
	      last SWITCH;
	  }	
      }
    }
    close LOG;
}

# Ora la struttura dati è costruita

my @stats=();
foreach my $command ( keys %results ) {
    my @data=@{$results{$command}};
    my ( $sum, $max, $min);
    $sum = 0;
    foreach ( @data ) {
	my ( $timestamp, $delay ) = @{$_};
	$sum=$sum+$delay;
	if ( ( ! defined $min ) || ( $min > $delay ) ) {
	    $min=$delay;
	}
	if ( ( ! defined $max ) || ( $max < $delay ) ) {
	    $max=$delay;
	}
    }
    push @stats, [ $command, $#data, $sum/$#data, $max, $min];
}

# Ha costruito l'array con le statistiche

# Ordino per tempo medio
#my @sorted = sort { @{$a}[2] <=> @{$b}[2] } @stats;

# Ordino per comando
my @sorted = sort { @{$a}[0] cmp @{$b}[0] } @stats;

foreach ( @sorted ) {
    my @data = @{$_};
    print "$data[0]\n";
    print "Number of calls: $data[1]\n";
    print "Average execution time: $data[2]\n";
    print "Maximum execution time: $data[3]\n";
    print "Minimum execution time: $data[4]\n";
} 

