diff Lib/PerfCounter.pm @ 0:03e58a454b20

Создан репозитарий
author Sergey
date Tue, 14 Jul 2009 12:54:37 +0400
parents
children 16ada169ca75
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Lib/PerfCounter.pm	Tue Jul 14 12:54:37 2009 +0400
@@ -0,0 +1,161 @@
+package PerfCounter;
+use strict;
+use Common;
+use Exporter;
+our @ISA = qw(Exporter);
+our @EXPORT = qw(&GetTimeCounter &StartTimeCounter &StopTimeCounter &SetDBIPerfCounter);
+
+our %Counters;
+
+sub Reset() {
+    $_->Reset foreach values %Counters;
+}
+
+sub GetTimeCounter {
+    my $counter = $Counters{$_[0]};
+    die new Exception("'$_[0]' already exists and isn't a time counter.") if ref $counter and ref $counter ne 'PerfInterval';
+    if (not ref $counter) {
+        $counter = new PerfInterval;
+        $Counters{$_[0]} = $counter;
+    }
+    return $counter;
+}
+
+sub StartTimeCounter {
+    my $counter = GetTimeCounter($_[0]);
+    if (not $counter->IsOpened) {
+        $counter->OpenInterval;
+    }
+}
+
+sub StopTimeCounter {
+    my $counter = GetTimeCounter($_[0]);
+    if ($counter->IsOpened) {
+        $counter->CloseInterval;
+    }
+}
+
+sub SetDBIPerfCounter{
+    my ($dbh,$name) = @_;
+    $name ||= 'DBI';
+    $Counters{$name} = DBIPerfomance->new(DBH => $dbh);
+}
+
+package PerfInterval;
+use Common;
+use Time::HiRes qw(gettimeofday tv_interval);
+
+sub new {
+    my $class = shift;
+    my $self = bless { StartTime => scalar(gettimeofday()) }, $class;
+    return $self;
+}
+
+sub CloseInterval {
+    my $this = shift;
+    
+    if (not $this->{'EndTime'}) {    
+        $this->{'EndTime'} = scalar(gettimeofday());    
+        $this->{'Value'} += $this->{'EndTime'} - $this->{'StartTime'};
+    }
+    
+    return $this->{'Value'};
+}
+
+sub Value {
+    my $this = shift;
+    
+    if (not $this->{'EndTime'}) {
+        return sprintf ( '%.3f+',scalar(gettimeofday()) - $this->{'StartTime'});
+    } else {
+        return sprintf ( '%.3f',$this->{'Value'});
+    }
+}
+
+sub Add {
+    my ($this,$interval) = @_;
+    
+    if(ref $interval eq 'PerfInterval') {
+        $this->{'Value'} += $interval->{'Value'};
+    } else {
+        $this->{'Value'} += $interval;
+    }
+    
+    return $this->{'Value'};
+}
+
+sub IsOpened {
+    my $this = shift;
+    return( not $this->{'EndTime'} );
+}
+
+sub OpenInterval {
+    my $this = shift;
+    
+    $this->{'StartTime'} = gettimeofday();
+    delete $this->{'EndTime'};
+    
+    return 1;
+}
+
+sub Reset {
+    my ($this) = @_;
+    
+    $this->CloseInterval();
+    $this->{'Value'} = 0;
+}
+
+package DBIPerfomance;
+use Common;
+our @ISA = qw(Object);
+
+BEGIN {
+    DeclareProperty DBH => ACCESS_READ;
+
+}
+
+sub CTOR {
+    my $this=shift;
+    $this->SUPER::CTOR(@_);
+
+    
+    $this->DBH->{Profile} = 6;
+}
+
+sub Reset {
+    my $this = shift;
+    $this->DBH->{Profile} = 6;
+}
+
+sub Value {
+    my ($this,%opt) = @_;
+
+    my $infoSelect = { count => 0, time => 0};
+    my $infoUpdate = { count => 0, time => 0};
+    my $infoTotal;
+
+    foreach my $stmt (grep /^SELECT/i,keys %{$this->DBH->{Profile}->{Data} || {}}) {
+        $infoSelect->{'count'} += $this->DBH->{Profile}{Data}{$stmt}{execute}[0] || 0;
+        $infoSelect->{'time'} += $this->DBH->{Profile}{Data}{$stmt}{execute}[1] || 0;
+    }
+
+    foreach my $stmt (grep /^UPDATE/i,keys %{$this->DBH->{Profile}->{Data} || {}}) {
+        $infoUpdate->{'count'} += $this->DBH->{Profile}{Data}{$stmt}{execute}[0] || 0;
+        $infoUpdate->{'time'} += $this->DBH->{Profile}{Data}{$stmt}{execute}[1] || 0;
+    }
+
+    $infoTotal->{'count'} = $infoSelect->{'count'} + $infoUpdate->{'count'};
+    $infoTotal->{'time'} = $infoSelect->{'time'} + $infoUpdate->{'time'};
+
+    if ($opt{'extended'}) {
+        return ($infoSelect,$infoUpdate,$infoTotal);
+    } else {
+        return sprintf( '%i (%.2f)', $infoTotal->{count},$infoTotal->{time} );
+    }
+}
+
+sub Queries {
+    my ($this) = @_;
+    return [ map { "$this->{$DBH}{Profile}{Data}{$_}{execute}[0] x $_"} sort grep $_, keys %{$this->DBH->{Profile}->{Data}}];
+}
+1;