bugGnash - The GNU Flash player - Bugs: bug #22461, GC preformance: increasing CPU...


bug #22461: GC preformance: increasing CPU usage

Submitted by:  Sandro Santilli <strk>
Submitted on:  Mon 03 Mar 2008 11:18:54 AM UTC  
Category: coreSeverity: 3 - Normal
Release: NoneStatus: Fixed
Privacy: PublicAssigned to: None
Open/Closed: Closed

Add a New Comment (Rich MarkupRich Markup):

You are not logged in

Please log in, so followups can be emailed to you.


(Jump to the original submission Jump to the original submission)

Thu 06 Mar 2008 03:33:20 PM UTC, comment #7:

permances are much more acceptable now, but still
the growing number of movieclips (over 2000 after a minute or so)
bring with them about double as much managed generic_character (I guess they are shapes...) which make GC still suffering.

Also, moving the mouse makes CPU jump up to 100%, and it's expected
given the high number of movies that need to be queried for mouse handlers..

Sandro Santilli <strk>
Project Member
Thu 06 Mar 2008 02:55:33 PM UTC, comment #6:

Committed a patch to head greatly reducing number of GC-managed objects. number of builtin_function objects in particular, are now stable, and the CPU problem isn't that much noticeable anymore.

Just a note: generic_character keeps growing, these are likely drawables of sprites, we might likely do better there too..

Sandro Santilli <strk>
Project Member
Wed 05 Mar 2008 04:05:41 PM UTC, comment #5:

Adding support for C function pointer getter/setter fixed this
problem. Profiling with that enabled is:

Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls ms/call ms/call name
13.35 0.49 0.49 1088225 0.00 0.00 gnash::PropertyList::setReachable() const
8.17 0.79 0.30 4485112 0.00 0.00 gnash::PropertyList::getProperty(unsigned int, unsigned int)
5.72 1.00 0.21 7245936 0.00 0.00 gnash::Property::setReachable() const
5.31 1.20 0.20 670490 0.00 0.00 gnash::sprite_instance::getBounds() const
4.63 1.37 0.17 697934 0.00 0.00 gnash::DisplayList::get_character_by_name_i(std::string const&)
3.54 1.50 0.13 1191 0.11 1.03 gnash::GC::collect()

You can see that GC::collect() itself gets down from 13.6% to 3.6% of total time spent (sample of 100 seconds runtime).

Number of builtin_function objects managed by the GC keeps constant from the start around 202 (vs. 10000 and growing in the original case).

Will cleanup and commit the new code.

Sandro Santilli <strk>
Project Member
Wed 05 Mar 2008 03:10:57 PM UTC, comment #4:

The builtin_function objects are getter-setter properties attached to each and every MovieClip instance. There's actually no need
for those to be full-featured builtin_functions (which is an as_function, which is an as_object and so a GcResource).

There are 22 of them for each instance, so 33 for getter and setter + any as_function and as_object overhead.

These properties don't need a property list, no inheritance, no memory management, no nothing. So I belive the way to go would
be just support C function entry points for getter-setters (in addition to the user-provided ones).

I'm trying that now...

Just for reference, every 'dot' (red and blue) on the screen is a MovieClip instance, created trought attachMovie.

After about 6 bounces on the wall, managed builtin_functions
are about 10000.

Sandro Santilli <strk>
Project Member
Wed 05 Mar 2008 11:39:14 AM UTC, comment #3:

Added some debugging in the GC, and found that there is an increasing number of builtin_function GC-managed objects.
I wouldn't expect builtin functions to increase at all...

Sandro Santilli <strk>
Project Member
Wed 05 Mar 2008 10:57:03 AM UTC, comment #2:

This seems GC-related too:

Flat profile:

Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls ms/call ms/call name
21.31 2.50 2.50 17271046 0.00 0.00 gnash::PropertyList::setReachable() const
13.66 4.10 1.60 1189 1.35 8.00 gnash::GC::collect()
11.96 5.50 1.40 46348188 0.00 0.00 gnash::Property::setReachable() const
10.50 6.73 1.23 1187 1.04 1.04 gnash::GC::cleanUnreachable()
7.00 7.55 0.82 14827718 0.00 0.00 gnash::as_accessors::markReachableResources() const
4.10 8.03 0.48 49040668 0.00 0.00 gnash::as_value::setReachable() const
2.82 8.36 0.33 5935 0.06 1.09 gnash::sprite_instance::markReachableResources() const

Sandro Santilli <strk>
Project Member
Mon 03 Mar 2008 11:21:36 AM UTC, comment #1:

Each of the dots left by the two balls is a MovieClip, this
means that the global instance list linearly grows as the
simulation goes on. 2 new entries every advance at 12 FPS, which
gives 24 new entries every second, with consequent increase in
garbage collection cost.

Sandro Santilli <strk>
Project Member
Mon 03 Mar 2008 11:18:54 AM UTC, original submission:

version: 6
md5: 687d4cbe2a2c38a58fd39de04353ca25

As the movie plays (a physics simulation), CPU usage keeps increasing linearly.

Sandro Santilli <strk>
Project Member


(Note: upload size limit is set to 16384 kB, after insertion of the required escape characters.)

Attach File(s):

No files currently attached


   task dependencies.

Items that depend on this one: None found


Carbon-Copy List
  • -unavailable- added by strk (Submitted the item)

    Do you think this task is very important?
    If so, you can click here to add your encouragement to it.
    This task has 0 encouragements so far.

    Only logged-in users can vote.


    Please enter the title of George Orwell's famous dystopian book (it's a date):



    Follow 9 latest changes.

    Date Changed By Updated Field Previous Value => Replaced By
    Thu 06 Mar 2008 03:52:28 PM UTCstrkStatusReady For Test=>Fixed
    Thu 06 Mar 2008 02:55:33 PM UTCstrkStatusIn Progress=>Ready For Test
      Assigned tostrk=>None
    Wed 05 Mar 2008 04:05:41 PM UTCstrkStatusNone=>In Progress
      Assigned toNone=>strk
    Wed 05 Mar 2008 10:59:04 AM UTCstrkDependencies-=>Depends on task #7831
    Wed 05 Mar 2008 10:57:03 AM UTCstrkCategoryNone=>core
      Summaryincreasing CPU usage=>GC preformance: increasing CPU usage

    Back to the top

    Powered by Savane 3.1-cleanup