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); //*SIGNAL* }; //___________________________________________________________________ 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); } } ///////////////////////////////////////////////////////////////////// //___________________________________________________________________ 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> //---- 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 //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 : Fri Jun 08 2001 - 11:51:21 MEST