Next: Mapping and Iteration, Previous: Avoid Unnecessary Consing, Up: General Efficiency Hints [Contents][Index]
Common Lisp has very powerful argument passing mechanisms. Unfortunately, two of the most powerful mechanisms, rest arguments and keyword arguments, have a significant performance penalty:
Although rest argument consing is worse than keyword parsing, neither problem is serious unless thousands of calls are made to such a function. The use of keyword arguments is strongly encouraged in functions with many arguments or with interfaces that are likely to be extended, and rest arguments are often natural in user interface functions.
Optional arguments have some efficiency advantage over keyword
arguments, but their syntactic clumsiness and lack of extensibility
has caused many Common Lisp programmers to abandon use of optionals
except in functions that have obviously simple and immutable
interfaces (such as subseq
), or in functions that are only
called in a few places. When defining an interface function to be
used by other programmers or users, use of only required and keyword
arguments is recommended.
Parsing of defmacro
keyword and rest arguments is done at
compile time, so a macro can be used to provide a convenient syntax
with an efficient implementation. If the macro-expanded form contains
no keyword or rest arguments, then it is perfectly acceptable in inner
loops.
Keyword argument parsing overhead can also be avoided by use of inline expansion (see inline-expansion) and block compilation (section block-compilation.)
Note: the compiler open-codes most heavily used system functions which have keyword or rest arguments, so that no run-time overhead is involved.
Next: Mapping and Iteration, Previous: Avoid Unnecessary Consing, Up: General Efficiency Hints [Contents][Index]