Over the weekend, I committed a few more passes: -gnu-class-imp-cache
Adds IMP caching for all message sends to classes. Roughly halves the cost of class message sends. -gnu-class-lookup-cache Avoids the class lookup in class message sends. Makes the time spent for sending 100,000,000 class messages drop from 56 seconds to 10 on my machine. -gnu-class-method-inline Attempts to inline class methods and method calls to super. If successful, eliminates the cost of a call. When combined with IMP caching makes a class or super message send cheaper than a (non-inline) C function call. This works best as a link-time optimisation. -gnu-loop-imp-cache Adds IMP caching to all message sends in loops. -gnu-nonfragile-ivar Eliminates the double-indirection of non-fragile ivars that's required for GCC compatibility if the ivar was in a class compiled with clang. Eliminates the indirect ivar lookup entirely if all of the superclasses are in this compilation unit (meaning that the ivar offset can only change if you recompile the module). This works best as a link-time optimisation. -gnu-objc-type-feedback - Objective-C type feedback for the GNU runtime. Adds profiling to all message sends (actually, to all calls to functions via pointer) recording what was actually called. -gnu-objc-feedback-driven-inline - Objective-C type feedback-driven inliner for the GNU runtime. Inlines calls based on the profiling info generated by the previous pass. This lets you speculatively inline calls to methods where the same method is called most of the time at a particular call site. It's probably too much effort to run the profile-driven pass on most code, but it might be useful for anything that's really CPU-bound. It's also possible that we could get some performance increase across the board by compiling -base with profiling enabled, run the test suite, and then recompile -base using the profiling info. It will also be used in LanguageKit soon, so Smalltalk code is run in the JIT initially with profiling enabled, then static compiled using the profiling info. LK automatically drops back to JIT mode and recompiles the static version if any frameworks have been modified, so it would be really great if we could include the bitcode for frameworks in the bundle somewhere - then LK could inline methods from there too. It would be really great to have some support in GNUstep Make for running these automatically... David -- Sent from my Difference Engine _______________________________________________ Gnustep-dev mailing list Gnustep-dev@gnu.org http://lists.gnu.org/mailman/listinfo/gnustep-dev