Previous: Stale Extensions, Up: Beyond the ANSI Standard


7.10 Efficiency Hacks

The sb-ext:purify function causes SBCL first to collect all garbage, then to mark all uncollected objects as permanent, never again attempting to collect them as garbage. This can cause a large increase in efficiency when using a primitive garbage collector, or a more moderate increase in efficiency when using a more sophisticated garbage collector which is well suited to the program's memory usage pattern. It also allows permanent code to be frozen at fixed addresses, a precondition for using copy-on-write to share code between multiple Lisp processes. This is less important with modern generational garbage collectors, but not all SBCL platforms use such a garbage collector.

— Function: sb-ext:purify &key root-structures environment-name

This function optimizes garbage collection by moving all currently live objects into non-collected storage. root-structures is an optional list of objects which should be copied first to maximize locality.

defstruct structures defined with the (:PURE T) option are moved into read-only storage, further reducing gc cost. List and vector slots of pure structures are also moved into read-only storage.

environment-name is gratuitous documentation for compacted version of the current global environment (as seen in sb!c::*info-environment*.) If nil is supplied, then environment compaction is inhibited.

This function is a no-op on platforms using the generational garbage collector (x86, x86-64, ppc).

The sb-ext:truly-the special form declares the type of the result of the operations, producing its argument; the declaration is not checked. In short: don't use it.

— Special Operator: sb-ext:truly-the value-type form

Specifies that the values returned by form conform to the value-type, and causes the compiler to trust this information unconditionally.

Consequences are undefined if any result is not of the declared type -- typical symptoms including memory corruptions. Use with great care.

The sb-ext:freeze-type declaration declares that a type will never change, which can make type testing (typep, etc.) more efficient for structure types.