F RANZ I NC. Optimizing and Debugging Programs in Allegro CL By Duane Rettig April, 2007
F RANZ I NC. Introduction Personal Tutorial will become available via ftp Some things available only in 8.1 Some concepts are from LUGM/1998
F RANZ I NC. Outline Debug Low Level Hacks Optimization
F RANZ I NC. Debug Zoom Niceties –[ run zoom.lisp] gdb/dbx/windbg interface –[ show manual demos]
F RANZ I NC. Low Level Hacks Intro: Structure of Allegro CL “ll” functions Lap code
F RANZ I NC. Structure of Allegro CL src/ c/*.c rs/*.cl code/*.cl compile asm *.s*.o *.fasl cc
F RANZ I NC. Structure (cont) *.o *.so ld *.fasl libacl*.so lisp (dumplisp) running lisp *.dxl
F RANZ I NC. 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))
F RANZ I NC. Example lisp ll code [run “both-fixnum-p.lisp”]
F RANZ I NC. “ll” functions [see ll-doc.html]
F RANZ I NC. Another ll example Some compiler-macros expand to ll funcs –[run char-code.lisp]
F RANZ I NC. Lap code comp::*hack-compiler-output* –[run hack-compiler-output.lisp] comp::*assemble-function-body* –[run assemble-function-body.lisp]
F RANZ I NC. Optimization Compilation Boxing and unboxing Read-line Foreign types Memcpy String manipulation Aligned pointers Hashing Runtime Analyzer
F RANZ I NC. Optimization Methodology Get it right first Profile it –The time macro –The Allegro CL Runtime Analyzer Hit the high cost items –Implementations –Algorithms
F RANZ I NC. Compilation Adding declarations to code (declare (:explain :types :inlining)) –[run inlining-demos.lisp]
F RANZ I NC. Boxing and Unboxing Ensuring optimal unboxability –[run unboxing.lisp] Immediate args –[see immediate-args.html]
F RANZ I NC. read-line What's wrong with it?
F RANZ I NC. 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]
F RANZ I NC. memcpy memcpy-up memcpy-down [see memcpy-demo.html]
F RANZ I NC. String Manipulation string+ and the standard, with concatenate [see string+.cl]
F RANZ I NC. 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”]
F RANZ I NC. Aligned Pointers (cont) most-positive-fixnum most-negative-fixnum for 32-bit: signed fixnum unsigned 0 #x7ffffffc #x #xfffffffc-1 (fix)
F RANZ I NC. Foreign types (sorry, under construction): Foreign-types aren't just for foreign-functions We can combine disciplines –[run mapped-aligned-ftype.lisp]
F RANZ I NC. 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
F RANZ I NC. 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]
F RANZ I NC. Hashing Hash tables are very efficient if hash codes are well-distributed excl::hash-table-stats –[run hash-table-stats.lisp]
F RANZ I NC. 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
F RANZ I NC. Time macro: extra closures This driver is not as simple as it looks! (defun test-driver (n) (time (dotimes (i n) (test-it)))
F RANZ I NC. Time macro: avoiding extra closures Use this instead: (defun test-driver (n) (dotimes (i n) (test-it)) (time (test-driver ))
F RANZ I NC. disassemble-profile Provides sample hit counts and percentages Multiple disassembles provide info similar to call-graph [show manual demo]
F RANZ I NC. Thank You.