Hi Maxim, I have included your proposed new functions in the CVS version. Thanks for the remark and contribution. Rene Brun Maxim Nikulin wrote: > > Hi, > > I use TGTextView widgets in my monitor program. Several thousands calls > of the AddLine() method make the program extremely slow. Using the > callgrind program I found that the AddLine() is most expensive in my > case because of Layout() invocations. > > I suggest add methods AddLineFast() and Update(). Together they do the > same work to AddLine(), but it becomes possible to invoke AddLineFast() > many times and call the slow Update() method only once. > > I prepare a patch for the 4.00.08b version, it's in the attachment. To > apply it type > patch -p1 < TGTextView_optimize.patch > in the root/gui directory. > > -- > Max > > -------------------------------------------------------------------------------- > diff -Naur --exclude '*.o' --exclude 'G_*' --exclude '*~' gui.orig/inc/TGTextView.h gui/inc/TGTextView.h > --- gui.orig/inc/TGTextView.h 2004-09-01 17:30:07.110372652 +0700 > +++ gui/inc/TGTextView.h 2004-09-01 17:31:38.282760265 +0700 > @@ -98,6 +98,8 @@ > virtual void SetText(TGText *text); > virtual void AddText(TGText *text); > virtual void AddLine(const char *string); > + virtual void AddLineFast(const char *string); > + virtual void Update(); > TGText *GetText() const { return fText; } > > virtual void DataChanged() { Emit("DataChanged()"); } //*SIGNAL* > diff -Naur --exclude '*.o' --exclude 'G_*' --exclude '*~' gui.orig/src/TGTextView.cxx gui/src/TGTextView.cxx > --- gui.orig/src/TGTextView.cxx 2004-09-01 17:30:07.434324342 +0700 > +++ gui/src/TGTextView.cxx 2004-09-01 17:59:00.471639063 +0700 > @@ -148,14 +148,32 @@ > { > // Add a line of text to the view widget. > > + AddLineFast(string); > + Update(); > +} > + > +//______________________________________________________________________________ > +void TGTextView::AddLineFast(const char *string) > +{ > + // Add a line of text to the view widget. > + // Fast version. Use it if you are going to add > + // several lines, than call Update(). > + > TGLongPosition pos; > pos.fX = 0; > pos.fY = fText->RowCount(); > fText->InsText(pos, string); > +} > + > +//______________________________________________________________________________ > +void TGTextView::Update () > +{ > + // Call this function after AddLineFast() > Layout(); > DrawRegion(0, 0, fCanvas->GetWidth(), fCanvas->GetHeight()); > } > > + > //______________________________________________________________________________ > Long_t TGTextView::ReturnLongestLineWidth() > {
This archive was generated by hypermail 2b29 : Sun Jan 02 2005 - 05:50:09 MET