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