ROOT logo
// $Id$
// **************************************************************************
// This file is property of and copyright by the ALICE HLT Project          *
// ALICE Experiment at CERN, All rights reserved.                           *
//                                                                          *
// Primary Authors: Sergey Gorbunov <sergey.gorbunov@kip.uni-heidelberg.de> 
//                  for The ALICE HLT Project.                              *
//                                                                          *
// Permission to use, copy, modify and distribute this software and its     *
// documentation strictly for non-commercial purposes is hereby granted     *
// without fee, provided that the above copyright notice appears in all     *
// copies and that both the copyright notice and this permission notice     *
// appear in the supporting documentation. The authors make no claims       *
// about the suitability of this software for any purpose. It is            *
// provided "as is" without express or implied warranty.                    *
//                                                                          *
//***************************************************************************


#include "AliHLTComponentBenchmark.h"

AliHLTComponentBenchmark::AliHLTComponentBenchmark( const char *Name )
  :fComponentName(Name),fNTimers(0),fNEvents(0), fTotalInput(0),fTotalOutput(0), fStatistics()
{
  // !
  Reset();
}

void AliHLTComponentBenchmark::Reset()
{
  // !
  fNEvents = 0;
  fTotalInput = 0;
  fTotalOutput = 0;
  for( int i=0; i<10; i++ ){
    fTimers[i].Reset();
    fTotalRealTime[i] = 0;
    fTotalCPUTime[i] = 0;
  }
  fStatistics = "";
}

void AliHLTComponentBenchmark::SetName( const char *Name )
{
  // !
  fComponentName = Name;
}

void AliHLTComponentBenchmark::SetTimer( Int_t i, const char *Name )
{
  // !
  if( i>=10 ) return;
  if( i>=fNTimers ){
    for( ; fNTimers<=i; fNTimers++ ){      
      fTimers[fNTimers].Reset();
      fTotalRealTime[fNTimers] = 0;
      fTotalCPUTime[fNTimers] = 0;
      fNames[fNTimers] = Form("timer %d",fNTimers);
    }
    fNames[i] = Name;   
  }
}

void AliHLTComponentBenchmark::StartNewEvent()
{
  // !
  fNEvents++;
  for( int i=0; i<10; i++ ){
    fTimers[i].Reset();
  } 
}

void AliHLTComponentBenchmark::Start( Int_t i )
{
  // !
  if( i>=10 ) return;
  fTimers[i].Start();
}

void AliHLTComponentBenchmark::Stop( Int_t i )
{
  // !
  if( i>=10 ) return;
  fTimers[i].Stop();
  fTotalRealTime[i]+= fTimers[i].RealTime();
  fTotalCPUTime[i] += fTimers[i].CpuTime();
}


void AliHLTComponentBenchmark::AddInput( Double_t x )
{
  // !
  fTotalInput+=x;
}

void AliHLTComponentBenchmark::AddOutput( Double_t x )
{
  // !
  fTotalOutput+=x;
}

const char *AliHLTComponentBenchmark::GetStatistics()
{
  // !
  if( fNEvents<=0 ) return fStatistics.Data();
  float ratio = 1;
  if( fTotalInput >0 ) ratio = fTotalOutput / fTotalInput;

  fStatistics = Form("%s, %ld events: in %.1f Kb, out %.1f Kb, ratio %.1f", 
		     fComponentName.Data(), fNEvents, fTotalInput/fNEvents/1024, fTotalOutput/fNEvents/1024, ratio);
  
  if( fNTimers<=0 ) return fStatistics.Data();
  float hz = ( fTotalRealTime[0] > 0 ) ?fNEvents/fTotalRealTime[0] : 0;
  fStatistics+=Form("; Time %.1fms/%.1fHz (real/cpu = ",fTotalRealTime[0]/fNEvents*1.e3,hz);
  
  for( int i=0; i<fNTimers; i++ ){
    if( i>0 ) fStatistics+=", ";
    fStatistics+= Form("%s %.1f/%.1fms",fNames[i].Data(),fTotalRealTime[i]/fNEvents*1.e3, fTotalCPUTime[i]/fNEvents*1.e3  );    
  }
  fStatistics+=")";
  return fStatistics.Data();
}


void AliHLTComponentBenchmark::GetStatisticsData( Double_t* statistics, TString* names )
{
  // !
  if( fNEvents<=0 ) return ;

  statistics[0] = fNEvents;
  statistics[1] = fTotalInput/fNEvents;
  statistics[2] = fTotalOutput/fNEvents;
  
  if( fNTimers<=0 ) return ;
  
  for( int i=0; i<fNTimers; i++ ){
	names[i] = fNames[i];
    statistics[3+i] = fTotalRealTime[i]/fNEvents*1.e3;
	statistics[4+i] = fTotalCPUTime[i]/fNEvents*1.e3;    
  }
  return ;
}
 AliHLTComponentBenchmark.cxx:1
 AliHLTComponentBenchmark.cxx:2
 AliHLTComponentBenchmark.cxx:3
 AliHLTComponentBenchmark.cxx:4
 AliHLTComponentBenchmark.cxx:5
 AliHLTComponentBenchmark.cxx:6
 AliHLTComponentBenchmark.cxx:7
 AliHLTComponentBenchmark.cxx:8
 AliHLTComponentBenchmark.cxx:9
 AliHLTComponentBenchmark.cxx:10
 AliHLTComponentBenchmark.cxx:11
 AliHLTComponentBenchmark.cxx:12
 AliHLTComponentBenchmark.cxx:13
 AliHLTComponentBenchmark.cxx:14
 AliHLTComponentBenchmark.cxx:15
 AliHLTComponentBenchmark.cxx:16
 AliHLTComponentBenchmark.cxx:17
 AliHLTComponentBenchmark.cxx:18
 AliHLTComponentBenchmark.cxx:19
 AliHLTComponentBenchmark.cxx:20
 AliHLTComponentBenchmark.cxx:21
 AliHLTComponentBenchmark.cxx:22
 AliHLTComponentBenchmark.cxx:23
 AliHLTComponentBenchmark.cxx:24
 AliHLTComponentBenchmark.cxx:25
 AliHLTComponentBenchmark.cxx:26
 AliHLTComponentBenchmark.cxx:27
 AliHLTComponentBenchmark.cxx:28
 AliHLTComponentBenchmark.cxx:29
 AliHLTComponentBenchmark.cxx:30
 AliHLTComponentBenchmark.cxx:31
 AliHLTComponentBenchmark.cxx:32
 AliHLTComponentBenchmark.cxx:33
 AliHLTComponentBenchmark.cxx:34
 AliHLTComponentBenchmark.cxx:35
 AliHLTComponentBenchmark.cxx:36
 AliHLTComponentBenchmark.cxx:37
 AliHLTComponentBenchmark.cxx:38
 AliHLTComponentBenchmark.cxx:39
 AliHLTComponentBenchmark.cxx:40
 AliHLTComponentBenchmark.cxx:41
 AliHLTComponentBenchmark.cxx:42
 AliHLTComponentBenchmark.cxx:43
 AliHLTComponentBenchmark.cxx:44
 AliHLTComponentBenchmark.cxx:45
 AliHLTComponentBenchmark.cxx:46
 AliHLTComponentBenchmark.cxx:47
 AliHLTComponentBenchmark.cxx:48
 AliHLTComponentBenchmark.cxx:49
 AliHLTComponentBenchmark.cxx:50
 AliHLTComponentBenchmark.cxx:51
 AliHLTComponentBenchmark.cxx:52
 AliHLTComponentBenchmark.cxx:53
 AliHLTComponentBenchmark.cxx:54
 AliHLTComponentBenchmark.cxx:55
 AliHLTComponentBenchmark.cxx:56
 AliHLTComponentBenchmark.cxx:57
 AliHLTComponentBenchmark.cxx:58
 AliHLTComponentBenchmark.cxx:59
 AliHLTComponentBenchmark.cxx:60
 AliHLTComponentBenchmark.cxx:61
 AliHLTComponentBenchmark.cxx:62
 AliHLTComponentBenchmark.cxx:63
 AliHLTComponentBenchmark.cxx:64
 AliHLTComponentBenchmark.cxx:65
 AliHLTComponentBenchmark.cxx:66
 AliHLTComponentBenchmark.cxx:67
 AliHLTComponentBenchmark.cxx:68
 AliHLTComponentBenchmark.cxx:69
 AliHLTComponentBenchmark.cxx:70
 AliHLTComponentBenchmark.cxx:71
 AliHLTComponentBenchmark.cxx:72
 AliHLTComponentBenchmark.cxx:73
 AliHLTComponentBenchmark.cxx:74
 AliHLTComponentBenchmark.cxx:75
 AliHLTComponentBenchmark.cxx:76
 AliHLTComponentBenchmark.cxx:77
 AliHLTComponentBenchmark.cxx:78
 AliHLTComponentBenchmark.cxx:79
 AliHLTComponentBenchmark.cxx:80
 AliHLTComponentBenchmark.cxx:81
 AliHLTComponentBenchmark.cxx:82
 AliHLTComponentBenchmark.cxx:83
 AliHLTComponentBenchmark.cxx:84
 AliHLTComponentBenchmark.cxx:85
 AliHLTComponentBenchmark.cxx:86
 AliHLTComponentBenchmark.cxx:87
 AliHLTComponentBenchmark.cxx:88
 AliHLTComponentBenchmark.cxx:89
 AliHLTComponentBenchmark.cxx:90
 AliHLTComponentBenchmark.cxx:91
 AliHLTComponentBenchmark.cxx:92
 AliHLTComponentBenchmark.cxx:93
 AliHLTComponentBenchmark.cxx:94
 AliHLTComponentBenchmark.cxx:95
 AliHLTComponentBenchmark.cxx:96
 AliHLTComponentBenchmark.cxx:97
 AliHLTComponentBenchmark.cxx:98
 AliHLTComponentBenchmark.cxx:99
 AliHLTComponentBenchmark.cxx:100
 AliHLTComponentBenchmark.cxx:101
 AliHLTComponentBenchmark.cxx:102
 AliHLTComponentBenchmark.cxx:103
 AliHLTComponentBenchmark.cxx:104
 AliHLTComponentBenchmark.cxx:105
 AliHLTComponentBenchmark.cxx:106
 AliHLTComponentBenchmark.cxx:107
 AliHLTComponentBenchmark.cxx:108
 AliHLTComponentBenchmark.cxx:109
 AliHLTComponentBenchmark.cxx:110
 AliHLTComponentBenchmark.cxx:111
 AliHLTComponentBenchmark.cxx:112
 AliHLTComponentBenchmark.cxx:113
 AliHLTComponentBenchmark.cxx:114
 AliHLTComponentBenchmark.cxx:115
 AliHLTComponentBenchmark.cxx:116
 AliHLTComponentBenchmark.cxx:117
 AliHLTComponentBenchmark.cxx:118
 AliHLTComponentBenchmark.cxx:119
 AliHLTComponentBenchmark.cxx:120
 AliHLTComponentBenchmark.cxx:121
 AliHLTComponentBenchmark.cxx:122
 AliHLTComponentBenchmark.cxx:123
 AliHLTComponentBenchmark.cxx:124
 AliHLTComponentBenchmark.cxx:125
 AliHLTComponentBenchmark.cxx:126
 AliHLTComponentBenchmark.cxx:127
 AliHLTComponentBenchmark.cxx:128
 AliHLTComponentBenchmark.cxx:129
 AliHLTComponentBenchmark.cxx:130
 AliHLTComponentBenchmark.cxx:131
 AliHLTComponentBenchmark.cxx:132
 AliHLTComponentBenchmark.cxx:133
 AliHLTComponentBenchmark.cxx:134
 AliHLTComponentBenchmark.cxx:135
 AliHLTComponentBenchmark.cxx:136
 AliHLTComponentBenchmark.cxx:137
 AliHLTComponentBenchmark.cxx:138
 AliHLTComponentBenchmark.cxx:139
 AliHLTComponentBenchmark.cxx:140
 AliHLTComponentBenchmark.cxx:141
 AliHLTComponentBenchmark.cxx:142