1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
// benchmark comparing write/read to/from keys or trees
// for example for N=10000, the following output is produced
// on a P IV 62.4GHz
//
// root -b -q bill.C or root -b -q bill.C++
//
//billw0 : RT= 1.070 s, Cpu= 1.050 s, File size= 45508003 bytes, CX= 1
//billr0 : RT= 0.740 s, Cpu= 0.730 s
//billtw0 : RT= 0.720 s, Cpu= 0.660 s, File size= 45163959 bytes, CX= 1
//billtr0 : RT= 0.420 s, Cpu= 0.420 s
//billw1 : RT= 6.600 s, Cpu= 6.370 s, File size= 16215349 bytes, CX= 2.80687
//billr1 : RT= 2.290 s, Cpu= 2.270 s
//billtw1 : RT= 3.260 s, Cpu= 3.230 s, File size= 6880273 bytes, CX= 6.5642
//billtr1 : RT= 0.990 s, Cpu= 0.980 s
//billtot : RT= 18.290 s, Cpu= 15.920 s
//******************************************************************
//* ROOTMARKS = 600.9 * Root3.05/02 20030201/1840
//******************************************************************
//
//Author: Rene Brun
#include "TFile.h"
#include "TSystem.h"
#include "TH1.h"
#include "TRandom.h"
#include "TStopwatch.h"
#include "TKey.h"
#include "TTree.h"
#include "TROOT.h"
const Int_t N = 10000; //number of events to be processed
TStopwatch timer;
void billw(Int_t compress) {
//write N histograms as keys
timer.Start();
TFile f("/tmp/bill.root","recreate","bill benchmark with keys",compress);
TH1F h("h","h",1000,-3,3);
h.FillRandom("gaus",50000);
for (Int_t i=0;i<N;i++) {
char name[20];
sprintf(name,"h%d",i);
h.SetName(name);
h.Fill(2*gRandom->Rndm());
h.Write();
}
timer.Stop();
printf("billw%d : RT=%7.3f s, Cpu=%7.3f s, File size= %9d bytes, CX= %g\n",compress,timer.RealTime(),timer.CpuTime(),
(Int_t)f.GetBytesWritten(),f.GetCompressionFactor());
}
void billr(Int_t compress) {
//read N histograms from keys
timer.Start();
TFile f("/tmp/bill.root");
TIter next(f.GetListOfKeys());
TH1F *h;
TH1::AddDirectory(kFALSE);
TKey *key;
Int_t i=0;
TH1F *hmean = new TH1F("hmean","hist mean from keys",100,0,1);
while ((key=(TKey*)next())) {
h = (TH1F*)key->ReadObj();
hmean->Fill(h->GetMean());
delete h;
i++;
}
timer.Stop();
printf("billr%d : RT=%7.3f s, Cpu=%7.3f s\n",compress,timer.RealTime(),timer.CpuTime());
}
void billtw(Int_t compress) {
//write N histograms to a Tree
timer.Start();
TFile f("/tmp/billt.root","recreate","bill benchmark with trees",compress);
TH1F *h = new TH1F("h","h",1000,-3,3);
h->FillRandom("gaus",50000);
TTree *T = new TTree("T","test bill");
T->Branch("event","TH1F",&h,64000,0);
for (Int_t i=0;i<N;i++) {
char name[20];
sprintf(name,"h%d",i);
h->SetName(name);
h->Fill(2*gRandom->Rndm());
T->Fill();
}
T->Write();
delete T;
timer.Stop();
printf("billtw%d : RT=%7.3f s, Cpu=%7.3f s, File size= %9d bytes, CX= %g\n",compress,timer.RealTime(),timer.CpuTime(),
(Int_t)f.GetBytesWritten(),f.GetCompressionFactor());
}
void billtr(Int_t compress) {
//read N histograms from a tree
timer.Start();
TFile f("/tmp/billt.root");
TH1F *h = 0;
TTree *T = (TTree*)f.Get("T");
T->SetBranchAddress("event",&h);
TH1F *hmeant = new TH1F("hmeant","hist mean from tree",100,0,1);
Long64_t nentries = T->GetEntries();
for (Long64_t i=0;i<nentries;i++) {
T->GetEntry(i);
hmeant->Fill(h->GetMean());
}
timer.Stop();
printf("billtr%d : RT=%7.3f s, Cpu=%7.3f s\n",compress,timer.RealTime(),timer.CpuTime());
}
void bill() {
TStopwatch totaltimer;
totaltimer.Start();
for (Int_t compress=0;compress<2;compress++) {
billw(compress);
billr(compress);
billtw(compress);
billtr(compress);
}
gSystem->Unlink("/tmp/bill.root");
gSystem->Unlink("/tmp/billt.root");
totaltimer.Stop();
Double_t rtime = totaltimer.RealTime();
Double_t ctime = totaltimer.CpuTime();
printf("billtot : RT=%7.3f s, Cpu=%7.3f s\n",rtime,ctime);
//reference is a P IV 2.4 GHz
Float_t rootmarks = 600*(16.98 + 14.40)/(rtime + ctime);
printf("******************************************************************\n");
printf("* ROOTMARKS =%6.1f * Root%-8s %d/%d\n",rootmarks,gROOT->GetVersion(),gROOT->GetVersionDate(),gROOT->GetVersionTime());
printf("******************************************************************\n");
}
|