[Gtk-sharp-list] Gtk.Application.Invoke + anonymous delegates == lots of uints?

Rafael Teixeira monoman at gmail.com
Sat Dec 9 08:36:02 EST 2006


Sorry, I maybe still somewhat sleepy.

I checked the code and discovered that Convert.ToString (int) also
autoboxes the int parameter and calls the ToString override of int32.

Anyway, the number of strings/stringbuilder instances that your line
of code would also create are in th 9K range so they aren't that big a
problem. Those uints are being generated elsewhere and are the real
problem, yet to be uncovered and solved.

:(

On 12/9/06, Rafael Teixeira <monoman at gmail.com> wrote:
> Answered too fast, sorry!!!
>
> Well looking at your code it shows the kind of problem I'm talking about:
>
>         int ctr = 0;
>
>         void test()
>         {
>                 while(true)
>                 {
>                         Gtk.Application.Invoke( delegate {
>                                 ctr++;
>                                 Label1.Text = ctr.ToString();
>                         });
>                         Thread.Sleep(10);
>                 }
>         }
>
> You are autoboxing ctr, in every call to ToString(). It is better to
> call some static method of Convert that accepts ints as a parameter to
> be formatted, like
>
>                                 Label1.Text = Convert.ToString(ctr);
>
> :)
>
> :)
> On 12/9/06, Rafael Teixeira <monoman at gmail.com> wrote:
> > It is worse: If heap-buddy is showing them up and GC collects them, it
> > means they are boxed uints (probaly autoboxed ones), what means a lot
> > of overhead creating/managing objects around the value type, beyond
> > the memory comsuption.
> >
> > Definitively we need to find the culprit, probably someone passing a
> > uint to some method that wants an object. Can you help to better
> > assess where it could be?
> >
> > Thanks,
> >
> > On 12/8/06, 32bitkid <jim at 32bitkid.com> wrote:
> > >  I seem to be getting a weird allocation of uints when using
> > > Gtk.Application.Invoke If i run the following code through heap-buddy:
> > > using System;
> > > using Gtk;
> > > using System.Threading;
> > >
> > > public class MainWindow : Gtk.Window
> > > {
> > >  Gtk.Label Label1;
> > >
> > >  public MainWindow() : base ("Test")
> > >  {
> > >  this.DeleteEvent += new DeleteEventHandler(OnDeleteEvent);
> > >
> > >  Label1 = new Gtk.Label("");
> > >  this.Add(Label1);
> > >  this.ShowAll();
> > >
> > >  Thread x = new Thread(new ThreadStart(test));
> > >  x.IsBackground = true;
> > >  x.Start();
> > >  }
> > >
> > >  int ctr = 0;
> > >
> > >  void test()
> > >  {
> > >  while(true)
> > >  {
> > >  Gtk.Application.Invoke( delegate {
> > >  ctr++;
> > >  Label1.Text = ctr.ToString();
> > >  });
> > >  Thread.Sleep(10);
> > >  }
> > >  }
> > >
> > >  protected void OnDeleteEvent( object sender, DeleteEventArgs e)
> > >  {
> > >  Application.Quit();
> > >  e.RetVal = true;
> > >  }
> > > }
> > >
> > >  I'll get a lot of uints allocated on the heap. Most seem to be cleaned up
> > > by the garbage collection, but still it doesnt seem quite right. Here is the
> > > output from heap-buddy, after running for about 5 seconds: $ heap-buddy
> > > types 10 sorted by count
> > >
> > >  Type # Total AvSz AvAge BT#
> > >  uint 557439 6.4M 12.0 0.0 18337
> > >  string 18558 863k 47.6 0.6 18418
> > >  byte[] 18400 357k 19.9 0.0 18400
> > >  GLib.TimeoutHandler 18392 718k 40.0 0.6 4
> > >  GLib.Timeout/TimeoutProxy 9196 143k 16.0 0.8 2
> > >  System.EventHandler 9196 359k 40.0 0.6 2
> > >  Gtk.Application/InvokeCB 9195 179k 20.0 0.6 1
> > >  object[] 9186 717k 80.0 0.0 9186
> > > System.Collections.ArrayList 9182 179k 20.0 0.0 9182
> > >  System.Text.StringBuilder 9179 215k 24.0 0.0 9179
> > >
> > >  Is this a bug, or am I just doing something very wrong. That just seems
> > > like a LOT of uints. This is basically a stub from another Gtk# program I'm
> > > working on that is fairly thread intestive. I don't remember seeing this
> > > kind of behavior before 1.2. I am running mono 1.2.2, on Fedora Core 5. Any
> > > help would be greatly appriciated. Thanks
> > > ________________________________
> > >  View this message in context: Gtk.Application.Invoke + anonymous delegates
> > > == lots of uints?
> > >  Sent from the Mono - Gtk# mailing list archive at Nabble.com.
> > >
> > > _______________________________________________
> > > Gtk-sharp-list maillist  -  Gtk-sharp-list at lists.ximian.com
> > > http://lists.ximian.com/mailman/listinfo/gtk-sharp-list
> > >
> > >
> > >
> >
> >
> > --
> > Rafael "Monoman" Teixeira
> > ---------------------------------------
> > "The reasonable man adapts himself to the world; the unreasonable one
> > persists in trying to adapt the world to himself. Therefore all
> > progress depends on the unreasonable man." George Bernard Shaw
> >
>
>
> --
> Rafael "Monoman" Teixeira
> ---------------------------------------
> "The reasonable man adapts himself to the world; the unreasonable one
> persists in trying to adapt the world to himself. Therefore all
> progress depends on the unreasonable man." George Bernard Shaw
>


-- 
Rafael "Monoman" Teixeira
---------------------------------------
"The reasonable man adapts himself to the world; the unreasonable one
persists in trying to adapt the world to himself. Therefore all
progress depends on the unreasonable man." George Bernard Shaw


More information about the Gtk-sharp-list mailing list