[ENH][VM][FIX] faster garbage collection, and removal of unused vars

John M McIntosh johnmci at smalltalkconsulting.com
Mon Dec 30 08:27:19 UTC 2002


This change set provides a 18 - 28% improvement in the GC logic using  
an test image that has 1.1 million objects in it on the PowerPC.
I won't comment on if this makes any difference on intel, however  
someone might try it and see what happens.

In early December I took a look at the garbage collector and realized  
for the mark logic, at least on the PowerPC, we were moving three key  
variables  in and out of memory multiple times per object, versus  
keeping everything in a register or two. Also we managed to make some  
procedure calls for each object we looked at, which is time consuming.

In discussing a possible fix with Tim, we realized that in some cases  
because of inlining, why some global variables actually become local  
variables because different SLANG methods are folded together.

This change set add logic to review variable usage and if possible fold  
variables that only appear in one inlined method into a declaration  
within the one method and dropped them from the globals. Right now I  
only deal with interp.c, and I've not really studied say variables  
across N methods where N is > 2 but say < 6 to understand what could be  
done with a bit more tweaking.

Interesting enough these variables are:
field, parentField, child in the Mark Logic
cntx, val in the interpret routine.

A bit of slang changing was also done to:

1) Provide an array headerTypeBytes, a lookup array for the header byte  
length calculation versus doing a couple of IF statements.
2) A few restructuring hints to ensure procedure calls actually become  
inlined, where in the past they violated an inlining rule.
3) Some really large routines in the compacting logic were broken into  
multiple routines, because the logic is really in multiple steps and  
this helps the compiler (ah stupid compilers) deal with register  
allocation better. Also it helps one think about why we have multiple  
steps.

I think a bit more work could be done in this area, but I'll look for  
feedback first.

Also I've moved the logic from voidIsNotInt that dealt with ensuring  
bogus unused variables are deleted into this change set.

Now for the Globals as a structure logic, I've attached an addendum  
change set (GCMakeItFasterGStruct-JMM.6.cs.gz) to provide the following  
feature: Declare foo as a pointer to the foo structure as a local, this  
makes for better powerpc code which improves overall performance by a  
few percentage points. You also need this changeset because of some  
structure changes if you've filed in the globals as a structure changes  
sets, and want the faster GC speed.

--
======================================================================== 
===
John M. McIntosh <johnmci at smalltalkconsulting.com> 1-800-477-2659
Corporate Smalltalk Consulting Ltd.  http://www.smalltalkconsulting.com
======================================================================== 
===
-------------- next part --------------
A non-text attachment was scrubbed...
Name: GCMakeItFaster-JMM.13.cs.gz
Type: application/x-gzip
Size: 11885 bytes
Desc: not available
Url : http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20021230/c785b8ad/GCMakeItFaster-JMM.13.cs.bin
-------------- next part --------------
A non-text attachment was scrubbed...
Name: GCMakeItFasterGStruct-JMM.6.cs.gz
Type: application/x-gzip
Size: 2230 bytes
Desc: not available
Url : http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20021230/c785b8ad/GCMakeItFasterGStruct-JMM.6.cs.bin


More information about the Squeak-dev mailing list