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