Benchmark comparing row-wise and column-wise storage performance
The test consists in writing/reading to/from keys or trees To execute the benchmark:
root -
b -
q bill.C or root -
b -
q bill.C++
for example for N=10000, the following output is produced on an 2.7 GHz Intel Core i7 (year 2011). The names featuring a "t" are relative to trees, the faster, the better.
billw0 : RT= 0.803
s, Cpu= 0.800
s, File size= 45608143 bytes, CX= 1
billr0 : RT= 0.388
s, Cpu= 0.390
s
billtw0 : RT= 0.336
s, Cpu= 0.310
s, File size= 45266881 bytes, CX= 1.00034
billtr0 : RT= 0.229
s, Cpu= 0.230
s
billw1 : RT= 1.671
s, Cpu= 1.670
s, File size= 16760526 bytes, CX= 2.72078
billr1 : RT= 0.667
s, Cpu= 0.680
s
billtw1 : RT= 0.775
s, Cpu= 0.770
s, File size= 9540884 bytes, CX= 4.74501
billtr1 : RT= 0.352
s, Cpu= 0.350
s
billtot : RT= 5.384
s, Cpu= 5.290
s
******************************************************************
* ROOTMARKS =1763.9 * Root6.05/03 20150914/948
******************************************************************
static constexpr double s
void billw(
const char *billname,
Int_t compress) {
TFile f(billname,
"recreate",
"bill benchmark with keys",compress);
TH1F h(
"h",
"h",1000,-3,3);
h.FillRandom(
"gaus",50000);
}
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(
const char *billname,
Int_t compress) {
TIter next(
f.GetListOfKeys());
TH1F *hmean =
new TH1F(
"hmean",
"hist mean from keys",100,0,1);
while ((key=(
TKey*)next())) {
hmean->
Fill(
h->GetMean());
i++;
}
printf(
"billr%d : RT=%7.3f s, Cpu=%7.3f s\n",compress,timer.
RealTime(),timer.
CpuTime());
}
void billtw(
const char *billtname,
Int_t compress) {
TFile f(billtname,
"recreate",
"bill benchmark with trees",compress);
h->FillRandom(
"gaus",50000);
T->Branch(
"event",
"TH1F",&
h,64000,0);
}
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(
const char *billtname,
Int_t compress) {
T->SetBranchAddress(
"event",&
h);
TH1F *hmeant =
new TH1F(
"hmeant",
"hist mean from tree",100,0,1);
hmeant->
Fill(
h->GetMean());
}
printf(
"billtr%d : RT=%7.3f s, Cpu=%7.3f s\n",compress,timer.
RealTime(),timer.
CpuTime());
}
void bill() {
TString billt = dir +
"/billt.root";
for (
Int_t compress=0;compress<2;compress++) {
billw(bill,compress);
billr(bill,compress);
billtw(billt,compress);
billtr(billt,compress);
}
printf("billtot : RT=%7.3f s, Cpu=%7.3f s\n",realtime,cputime);
printf("******************************************************************\n");
printf(
"* ROOTMARKS =%6.1f * Root%-8s %d/%d\n",
rootmarks,
gROOT->GetVersion(),
gROOT->GetVersionDate(),
gROOT->GetVersionTime());
printf("******************************************************************\n");
}
R__EXTERN TRandom * gRandom
R__EXTERN TSystem * gSystem
A ROOT file is a suite of consecutive data records (TKey instances) with a well defined format.
1-D histogram with a float per channel (see TH1 documentation)}
static void AddDirectory(Bool_t add=kTRUE)
Sets the flag controlling the automatic add of histograms in memory.
virtual Int_t Fill(Double_t x)
Increment bin with abscissa X by 1.
Book space in a file, create I/O buffers, to fill them, (un)compress them.
virtual TObject * ReadObj()
To read a TObject* from the file.
virtual Double_t Rndm()
Machine independent random number generator.
Double_t RealTime()
Stop the stopwatch (if it is running) and return the realtime (in seconds) passed between the start a...
void Start(Bool_t reset=kTRUE)
Start the stopwatch.
Double_t CpuTime()
Stop the stopwatch (if it is running) and return the cputime (in seconds) passed between the start an...
void Stop()
Stop the stopwatch.
virtual const char * DirName(const char *pathname)
Return the directory name in pathname.
virtual const char * UnixPathName(const char *unixpathname)
Convert from a Unix pathname to a local pathname.
virtual int Unlink(const char *name)
Unlink, i.e.
A TTree represents a columnar dataset.
- Author
- Rene Brun
Definition in file bill.C.