Performance Problem with TIterator

From: Christian Hilbes (hilbes@particle.phys.ethz.ch)
Date: Fri Dec 17 1999 - 16:53:32 MET


Hi,

I am using a TIterator to loop over a TClonesArray I read from a tree
(structure similar to ATLFast code). I do something like the following

hit is an Object of type Hit* and 
fHits is a TClonesArray of Hit's

for (i = 0; i < nb_events; i++) {

  tree->GetEvent(i);

  TIter next(fHits)

  while ((hit = (Hit*)next())) {

    // do stuff

  }

  // do a clear of the Arrays here

}

The problem is, that if the TClonesArray is empty (which happens quite
often for one of my branches), a loop over the tree is really slow :350
events per second. If I add the following however

for (i = 0; i < nb_events; i++) {

  tree->GetEvent(i);

  TIter next(fHits)

  if (fHits->GetEntriesFast()) {
    while ((hit = (Hit*)next())) {

      // do stuff
    }
  }

  // do a clear of the arrays here

} 

the loop is speeded up by quite a big factor : 2900 events per second. 

In case of a brach without empty arrays, the performace is about 2500
evts. per second.

The while loop is in fact not entered for empty arrays in the first case
-> why does the call to next() take so much time if the TClonesArray is
empty?

Cheers,

Christian Hilbes

IPP - ETH Zuerich



This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:43:44 MET