these programs create snapshots of l1 processes and analyze their heap storage. we use these programs to tune the *performance* of the code l1 generates to analyzes heaps. s0 creates a snapshot of the process in which it executes (snap0). it uses a l1 names file (../l1.names) to traverse the snapshot heap and report statistics. it also emits a new names file (./stat.names) that contains the subset of l1.names needed to traverse the heap. s0 requires the l1 -r flag because its uses slimns to compute stat.names. s1 is very similar to s0: it creates a snapshot of the process in which it executes (snap1), traverses the snapshot heap, and reports the same statistics as s0. the difference is that s1 loads stat.names instead of l1.names, which substantially reduces its code allocation (5.7MB vs 76.9MB), and thus the size of its snapshot and the time required to traverse it. s2 re-runs either of the heap analyses of s0 or s1 on previously computed snap0 or snap1 snapshots. by default it re-runs s1. in both cases it uses the stat.names namespace. s2 is a benchmark for iterative performance experiments: s2 on snap1 is a quick experiment; s2 on snap0 is a longer one. s0 and s1 together bootstrap these experiments. the scripts expect to run in the directory they occupy. usage: % cd % make % dwarf2cqct < l1 > l1.names % cd perf % ../l1 -r ./s0.cqct % ../l1 ./s1.cqct % ../l1 ./s2.cqct # quick experiment % ../l1 ./s2.cqct snap0 # longer one