RE: [ROOT] speed problem for unexecuted statements

From: Philippe Canal (pcanal@fnal.gov)
Date: Mon Feb 09 2004 - 18:09:09 MET


Hi Peter,

I assume that you experience this performance variation in CINT.
If this the case, you can improve (and stabilize performance) by
compiling your code instead.  This can trivially be done but 
just using ACLiC.  Instead of doing:
	root [] .L mymacro.C
do
	root [] .L mymacro.C+

Cheers,
Philippe

PS. CINT's optimization mechanism has several limits which depend
(among other things) on the size of the code, the number of loops,
the usage (or not) of special interpreter feature (like support for
gPad).
 
-----Original Message-----
From: owner-roottalk@pcroot.cern.ch
[mailto:owner-roottalk@pcroot.cern.ch]On Behalf Of Peter Shanahan
Sent: Sunday, February 08, 2004 2:30 PM
To: roottalk@pcroot.cern.ch
Subject: [ROOT] speed problem for unexecuted statements


Dear Rooters,

     I have a strange speed problem with an unnamed macro.  I am
looping over the bins in a TH2C, getting the contents, and doing
various things based on them, mainly plotting other histograms.  I find
that the execution is very slow, even for cases where each of the "if
(stat&...) shown below are false. (I've verified this with print
statements, watching how long it takes to get to the next bin in the
histogram.)

    I've removed the actual code inside the if{} blocks below for sake of
brevity, but I find that just removing a reference to gPad
(SetLogx(0 or 1)) within each of the if blocks speeds up the execution by
factors of 10.  I need the gPad reference to set log/non-log depending on
the case.

    Does someone know:

     1) why does the performance speed depend on the presence or absence
        of statements that don't get executed because they are inside
        false if statements?  Is it some interpreter optimization that
        tries to determine whether the state of gPad has changed?

     2) is there something I can do about it?   Many thanks,

Peter Shanahan


{

	TH2C* ChanStatus=(TH2C*)f.Get("ChanStatus");

	TCanvas* myCanvas=new TCanvas();
	gPad->SetLogx(0);
	Bool_t doRandoms=false;
	Bool_t doBadRes=true;
	Bool_t doBadRms=true;
	Bool_t doBadPed=true;

	for (Int_t ix=40; ix<=140; ix++)
	{
		Int_t jx=ix-1;
		for (Int_t iy=1; iy<=40; iy++)
		{

			Int_t jy=iy-1;
			Char_t stat=ChanStatus->GetBinContent(ix,iy);
			Int_t crate=jx/48+(jy/32)*4;
			Int_t module=(jx%48)/4;
			Int_t masterch=7-(jy%32)/4;
			Int_t minderch=jx%4+(jy%4)*4;
			cout << ix <<" "<<iy<<" "<<(Int_t) stat<<endl;

			if (stat&1 && doRandoms)
			{
				cout << "stat 1"<<endl;
			} // if Random

			if (stat&2 && doBadRes)
			{
				cout << "stat 2"<<endl;
			} // if badres

			if (stat&4 && doBadRms)
			{
				cout << "stat 4"<<endl;
			} // if Rms

			if (stat&8 && doBadPed)
			{
				cout << "stat 8"<<endl;
			} // if badped

		}  // iy

	}  // ix


	delete myCanvas;
	myCanvas=0;


}


=======================================================================
  Fermilab MS-220                            Phone: (+1) 630 840 8378
  P.O. Box 500                               Fax:   (+1) 630 840 6039
  Batavia, IL 60510 USA


#################################################################
#################################################################
#################################################################
#####
#####
#####
#################################################################
#################################################################
#################################################################



This archive was generated by hypermail 2b29 : Sun Jan 02 2005 - 05:50:05 MET