Hi Valery, thanks for the test. Could you add several extra signals into your test class to see how list of signals/connections lookup affects the performance? Regards, Anton http://www.smartquant.com ----- Original Message ----- From: Valeriy Onuchin <onuchin@fnal.gov> To: Anton Fokin <anton.fokin@smartquant.com> Cc: <roottalk@pcroot.cern.ch> Sent: Monday, March 26, 2001 4:44 AM Subject: Re: [ROOT] TQObject::Emit() > Hi Anton, > check a simple stress test of signals/slots below. > - the result on Pentium III 800 Mhz is 15 microseconds per call with Emit. > - the result for calls without Emit is 0.015 microseconds per call. > - the results for compiled executable program are the same. > > Regards. Valeriy > > > root [0] .x stress.C++ > Creating shared library /home/onuchin/tmp/./stress_C.so > Class A: Streamer() not declared > Class A: ShowMembers() not declared > Nevents 1000000, Real time 0:0:14, CP time 14.900 > > > To compile stanalone executable program: > > > $root -b -q >/dev/null stress.C | echo '{gSystem->CompileMacro("stress.C","kf");}' >tmp.C > $g++ -o stress stress.C `root-config --cflags --libs` -DSTANDALONE > > > > > > ---------------------------- stress.C --------------------------------- > > #include <TQObject.h> > #include <RQ_OBJECT.h> > #include <TStopwatch.h> > > /////////////////////////////////////////////////////////////////////// > class A > { > RQ_OBJECT() > > private: > Int_t fValue; > public: > A():fValue(0) { } > ~A() { } > > void SetValue(Int_t value); file://*SIGNAL* > }; > > > file://___________________________________________________________________ > void A::SetValue(Int_t value) > { > // Set new value. > // Emit signal "SetValue(Int_t)" with a single parameter > > if(value!=fValue) { > fValue=value; > Emit("SetValue(Int_t)",fValue); > } > } > > ///////////////////////////////////////////////////////////////////// > file://___________________________________________________________________ > void stress() > { > // Simple tests on signals, slots and connections > > A a; > A b; > > a.Connect("SetValue(Int_t)","A",&b,"SetValue(Int_t)"); > > const Int_t nevents = 1000000; > > TStopwatch timer; > timer.Start(); > for(int i=0; i<nevents; i++) a.SetValue(i); > timer.Stop(); > printf("Nevents %d, ",nevents); > timer.Print(); > } > > ///////////////////////////// Main program //////////////////////// > #ifdef STANDALONE > > #include <TROOT.h> > #include <TApplication.h> > #include <TSystem.h> > > file://---- Main program ------------------------------------------------- > > TROOT root("tst","Stress test of signal/slots"); > > int main(int argc, char **argv) > { > gSystem->Load("./tst_C"); > TApplication* app = new TApplication("",0,0); > stress(); > return 0; > } > #endif file://STANDALONE > > ---------------------------- stress.C --------------------------------- > > > > Anton Fokin wrote: > > > Hi Valery, > > > > I meant that Emit("DataChanged()") call might be time consuming since you > > take an argument as char string, compress it and loop over class and object > > signal/connection lists (why don't you use hash table, btw?). I was curious > > how it is done in Qt/moc. If you say it does nearly the same, no probs. A > > benchmark test could be like > > > > while (end_test) { > > DataChanged(); > > } > > > > with and without Emit() in DataChanged(). Of course nobody should be > > connected to this signal. On the other hand result will depend on how long > > are lists of signals... > > > > > > I am also not sure what it takes in Qt/moc. In Qt you do not need to > > call > > > > Emit() in a signal method - the signal will be emitted automatically > > once > > > > the method is declared as signal. > > > > > > > > > > ("It is not correct ..." Valery Fine;) > > > > > > > > > I studied Qt code ... it also uses "Emit" method inside "signal" > > > Suppose looking at the code produced after MOC preprocessor will reveal > > it. > > > > I am also not sure what it takes in Qt/moc. In Qt you do not need to > > call > > > > Emit() in a signal method - the signal will be emitted automatically > > once > > > > the method is declared as signal. > > > > > > > > > > ("It is not correct ..." Valery Fine;) > > > > > > > > > I studied Qt code ... it also uses "Emit" method inside "signal" > > > Suppose looking at the code produced after MOC preprocessor will reveal > > it. > > > > Yes, that was the questions. I meant that a user does not need to put Emit() > > in the body of a signal method in Qt - moc does it. I asked if it is done in > > a clever way since moc has control over the code and can make some "direct" > > substitutions. > > > > Regards, > > Anton > > > > http://www.smartquant.com > > > > ----- Original Message ----- > > From: Valeriy Onuchin <onuchin@fnal.gov> > > To: Anton Fokin <anton.fokin@smartquant.com> > > Cc: <roottalk@pcroot.cern.ch> > > Sent: Thursday, March 22, 2001 11:27 PM > > Subject: Re: [ROOT] TQObject::Emit() > > > > > Hi Anton, > > > > > > Anton Fokin wrote: > > > > > > > > > > > > > > > Hi, > > > > > > > > If I want to use singal/slots I have to add Emit("DataChanged()"); or > > alike > > > > in my TQObject inherited class method to emit a signal. I am curious if > > this > > > > call is costly or not. > > > > > > What cost do you mean? > > > > > > Memory? > > > > > > TQObject has 2 data members which are pointers to > > Lists( sizeof(TList*) = 4 ). > > > These TLists are created(new TList) only when connection is > > established > > > ( sizeof(TList) = 44 ). During creation of connection some internal > > structures > > > are also initiated, but it was designed to make it minimal amd reuses > > existent ones. > > > > > > > > > > > > > > > > > > I am also not sure what it takes in Qt/moc. In Qt you do not need to > > call > > > > Emit() in a signal method - the signal will be emitted automatically > > once > > > > the method is declared as signal. > > > > > > > > > > ("It is not correct ..." Valery Fine;) > > > > > > > > > I studied Qt code ... it also uses "Emit" method inside "signal" > > > Suppose looking at the code produced after MOC preprocessor will reveal > > it. > > > > > > > > > > > > > > > > > So could you comment on performance of Emit("DataCahnged()") decoding > > (with > > > > CINT dict, etc.) compare to Qt moc processing. > > > > > > Fair comparison of benchmark tests is always difficult task > > > ( btw it's not a bad business > > http://www.tpc.org/information/about/join.asp ) > > > > > > Suggest the "fair test" and I/we can try it. > > > > > > > > > Regards. Valeriy > > > > > > > > > > > >
This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:50:40 MET