310 likes | 410 Vues
Dive into fundamental tips and techniques for optimizing and debugging programs in Allegro CL, covering low-level hacks, optimization methodologies, compilation strategies, and runtime analysis. Get insights on data structures, memory management, hashing, and more.
E N D
Optimizing and Debugging Programs in Allegro CL By Duane Rettig April, 2007
Introduction • Personal • Tutorial will become available via ftp • Some things available only in 8.1 • Some concepts are from LUGM/1998
Outline • Debug • Low Level Hacks • Optimization
Debug • Zoom Niceties • [ run zoom.lisp] • gdb/dbx/windbg interface • [ show manual demos]
Low Level Hacks • Intro: Structure of Allegro CL • “ll” functions • Lap code
Structure of Allegro CL src/ code/*.cl c/*.c rs/*.cl compile cc compile *.fasl *.s asm *.o
Structure (cont) *.fasl *.o lisp ld *.so running lisp lisp (dumplisp) libacl*.so *.dxl
Example rs code (def-runtime-q new-ratio (num den) (let ((rat (q-allocate-heap-other #md-ratio-type-code #md-ratio-size))) (setf (ls md-ratio num rat) num) (setf (ls md-ratio den rat) den) rat))
Example lisp ll code • [run “both-fixnum-p.lisp”]
“ll” functions • [see ll-doc.html]
Another ll example • Some compiler-macros expand to ll funcs • [run char-code.lisp]
Lap code • comp::*hack-compiler-output* • [run hack-compiler-output.lisp] • comp::*assemble-function-body* • [run assemble-function-body.lisp]
Optimization • Compilation • Boxing and unboxing • Read-line • Foreign types • Memcpy • String manipulation • Aligned pointers • Hashing • Runtime Analyzer
Optimization Methodology • Get it right first • Profile it • The time macro • The Allegro CL Runtime Analyzer • Hit the high cost items • Implementations • Algorithms
Compilation • Adding declarations to code • (declare (:explain :types :inlining)) • [run inlining-demos.lisp]
Boxing and Unboxing • Ensuring optimal unboxability • [run unboxing.lisp] • Immediate args • [see immediate-args.html]
read-line • What's wrong with it?
read-line • It always conses! • What to do? • read-line-into • Never conses • Must deal with overflowing lines • simple-stream-read-line • Two modes • implementation for read-line • similar to read-line, handling overflows • [see read-line-test.html]
memcpy • memcpy-up • memcpy-down • [see memcpy-demo.html]
String Manipulation • string+ and the standard, with concatenate • [see string+.cl]
Aligned Pointers • Allow cons-free pointer manipulation • Pointers look like fixnums • Pointers must be aligned to: • 32-bit: 4-byte boundaries • 64-bit: 8-byte boundaries • [see “aligned.html”]
Aligned Pointers (cont) unsigned for 32-bit: signed fixnum 0 0 #x7ffffffc most-positive-fixnum #x80000000 most-negative-fixnum #xfffffffc -1 (fix)
Foreign types • (sorry, under construction): • Foreign-types aren't just for foreign-functions • We can combine disciplines • [run mapped-aligned-ftype.lisp]
Hashing • :test extensions • :values [t] (may be nil or :weak) • :weak-keys [nil] (may be non-nil) • :hash-function [nil] (or fboundp symbol) • must return • 24 bit value for 32-bit lisps • 32 bit value for 64-bit lisps
Hashing • Rehash-issues • excl::*default-rehash-size* • excl::*allocate-large-hash-table-vectors-in-old-space* • excl::convert-to-internal-fspec • example of weak-key, sans-value hash-table • [run shared-cons-table.lisp]
Hashing • Hash tables are very efficient if hash codes are well-distributed • excl::hash-table-stats • [run hash-table-stats.lisp]
Runtime Analyzer • (explain the name) • Always compile top-level test functions • Do not use time macro with profiler • Avoid simultaneous time/call-count profiles • When using time macro, beware of new closures • Use prof:disassemble-profile
Time macro: extra closures • This driver is not as simple as it looks! (defun test-driver (n) (time (dotimes (i n) (test-it)))
Time macro: avoiding extra closures • Use this instead: (defun test-driver (n) (dotimes (i n) (test-it)) (time (test-driver 1000000))
disassemble-profile • Provides sample hit counts and percentages • Multiple disassembles provide info similar to call-graph • [show manual demo]