Proposal: ClassInfo hasFinalizer field

dsimcha dsimcha at yahoo.com
Sat Jun 4 09:58:22 PDT 2011


This post was inspired by my recent work optimizing D's garbage 
collector and the Port A Benchmark thread.

The current implementation of druntime flags **ALL** classes as having 
finalizers when allocated via the new operator, even if they don't.  The 
GC then calls an empty finalizer pointed to by class's vtable.  In 
certain GC benchmarks, calling all these empty finalizers actually adds 
up to a substantial (~15-20%) performance penalty.

For example, the tree benchmark provided by Bearophile back when I was 
working on GC optimizations (available at 
https://github.com/dsimcha/druntime/blob/master/gcBench/tree1.d) runs in 
about 44-45 seconds on my machine using stock DMD 2.053.  It creates 
tons of tiny class objects with no finalizers.  When I temporarily 
disable calling finalizers in the GC code, the runtime for this 
benchmark is cut to 36-37 seconds.  If this isn't low-hanging fruit, I 
don't know what is.

What we need is to include a hasFinalizer field in ClassInfo that is 
true iff a class or any of its ancestors has a non-empty finalizer. 
Then, the finalize flag in the GC can be set on allocating a class using 
the new operator only if this flag is true.  This would save the time 
spent calling empty finalizers in places where tons of small, 
finalizer-free classes are allocated, and probably result in a decent 
speedup.

I've filed an enhancement request to get a hasFinalizer field in 
Classinfo.  (http://d.puremagic.com/issues/show_bug.cgi?id=6103)  I am 
not familiar enough with the DMD codebase to do this myself, but I 
imagine it's a pretty simple enhancement for someone who is.  If someone 
else takes care of the compiler, I'll take care of the corresponding 
druntime changes.


More information about the Digitalmars-d mailing list