PreliminaryStudyDoc.tioga
Ken Pier, December 18, 1985 11:41:34 am PST
PRELIMINARY STUDY OF RESEARCH INTERPRESS
DIGITAL PRE-PRESS SYSTEM DOCUMENT — FOR INTERNAL XEROX USE ONLY
Preliminary Study Of Research Interpress for a Digital Pre-Press System
Digital Pre-Press System (DIPPSY) Document
Ken Pier, Michael Plass, and Maureen Stone
© Copyright 1985 Xerox Corporation. All rights reserved.
Abstract: This document contains an introduction to the Research Interpress implementation in the Cedar programming environment and a preliminary timing study of the Interpress code in Cedar running on the Dorado Personal Computer. This code consists of two main parts: the Interpress Interpreter and the Cedar Imager. The Interpreter is a Cedar application written specifically for the purpose of executing Interpress masters, while the Imager is the general purpose graphics package available in Cedar to convert high-level graphics primitives to raster images on a wide variety of devices. The timing study utilizes performance monitoring tools available in Cedar to record and display parameters such as CPU utilization, storage allocation activity, or detailed accounts of time utilization on a per process or per procedure basis. The elements of the Dorado machine architecture that might impact the results of this study are noted, and possible directions for further investigations are mentioned.
This document fulfills the specification of Task #2, Phase 1 of the DIPPSY-PARC Transfer Agreement of November 22, 185.
Created by: Ken Pier, Michael Plass, and Maureen Stone
Keywords: Cedar, Interpress, Imager, Digital Pre-Press System
XEROX  Xerox Corporation
   Palo Alto Research Center
   3333 Coyote Hill Road
   Palo Alto, California 94304

For Internal Xerox Use Only
Purpose and scope of this study
This document begins with an introduction to Research Interpress in the Cedar programming environment. Following is a preliminary timing study of the Cedar Interpress implementation used to interpret digital map data encoded as Interpress masters. The Interpress code consists of two main parts: the Interpress Interpreter and the Cedar Imager. The Interpreter is a Cedar application written specifically for the purpose of executing Interpress masters, while the Imager is the general purpose graphics package available in Cedar to convert high-level graphics primitives to raster images on a wide variety of devices. The timing study utilizes performance monitoring tools available in Cedar to record and display parameters such as CPU utilization, storage allocation activity, or detailed accounts of time utilization on a per process or per procedure basis. Elements of the hardware machine architecture that might impact the results of this study are noted, and possible directions for further investigations are mentioned.
This study was performed on the existing Interpress implementation on the Dorado [1] computer. Little attempt was made to optimize the system for digital map data or to fix problems identified by the study. This report includes comments on possible issues for further investigation. Also note that this study was performed with the only two samples of digital map data available at this time.
Introduction to Dorado
The Dorado supports a variety of high-level language programming environments and high bandwidth I/O devices. Although the Dorado far exceeds the capabilities and cost of what is traditionally thought of as a personal computer, it is personal in the sense that it is designed to be used by a single user running multiple cooperating processes in an integrated programming environment. It has a microprogrammed processor with a 60 nanosecond microinstruction cycle time, a high-speed cache for both instructions and data, a hardware memory map supporting virtual memory implementations, a large main memory (8 MBytes in the current machine), an instruction fetch/decode unit which runs in parallel with the instruction execution unit, and high-resolution monochrome and color displays. The processor is shared among priority ordered microcoded tasks, performing microcode context switches on demand with no overhead. The memory subsystem can deliver a peak main storage bandwidth of 66 MBytes per second to service I/O devices and cache misses. The cache miss rate is commonly 1% or less. The instruction fetch/decode unit (IFU) speeds up the emulation of instructions by fetching, decoding, and preparing later instructions in parallel with the execution of earlier ones. A writeable decoding memory allows the IFU to be specialized to particular instruciton sets. There are implementation of instruction sets for the BCPL [Thacker], Mesa [Johnsson], Interlisp-D [Masinter], Smalltalk [Goldberg], and Cedar [Swinehart, Teitelman] languages and programming environments. There is microprogrammed execution of the BITBLT operation in each of the environments. The Dorado is implemented using standard ECL technology.
Reference [1], enclosed with this report, extensively documents the Dorado hardware.
Introduction to Cedar
Cedar is an integrated programming environment which supports the development of programs in a single language also named Cedar or the Cedar Language. Produced by PARC/CSL, Cedar is a research evironment supporting the development and use of experimental programs, emphasizing office information and personal information management applications. Cedar supports the execution of concurrent applications such as compilation, editing, status display, and remote filing and execution in background. Cedar includes a large virtual address space (24 bits of virtual address), efficient and powerful facilities for the automatic management of storage, and a rich set of program development tools such as editors, compilers, symbolic debuggers, and version management control. Fundamental to Cedar is a general and powerful graphics package called the Imager, through which the many uses of graphics in Cedar, including the interactive environment, are implemented.
The Cedar language is descended from Mesa, a strongly-typed systems implementations language in the Pascal language family. Mesa has facilities for modularization and separate compilation of program modules, lightweight processes and monitors, exception handling, and procedure variables. Cedar extensions to Mesa retain strong type checking while providing automatic storage management and facilities for delaying the binding of type information until run time.
Extensive information on Cedar may be found in [Teitelman], [Swinehart], and [Beach].
Introduction to Interpress and Imager
Interpress [IPStandard, IPIntro] began as a research effort within the Computing Sciences Laboratory at PARC. Interpress finds its roots in a number of earlier systems developed at PARC. One of these is Press [7]. Another source of the ideas came from the combination of JaM (a simple interpreted postfix language) together with a graphics package (initially JaMGraphics, later CedarGraphics) that utilized essentially the same imaging model as Interpress [9]. The experience gained in implementing these prototypes was applied to the development of a specification for printable documents. The result of these research efforts has come to be called Research Interpress, from which portions have been selected and established as a Xerox Standard. The first such corporate standard was Interpress 82, followed by Interpress 2.0 and Interpress 2.1, and recently Interpress 3.0. In parallel with these standardization activities and implementations of the standard by product organizations, a small group within PARC/CSL has been developing and refining an implementation of Research Interpress in the Cedar programming environment.
The Interpress/Imager relationship
The imaging operations detailed in Chapter 4 of the Interpress Standard are useful in a wider context than Interpress. To capitalize on this, we have built the implementation of these operations as a separate graphics package, called the Imager. Although the Imager is in some ways a descendant of CedarGraphics, an earlier graphics package for Cedar, it was built from scratch and has a significantly different internal structure. In Cedar6.0, the Imager is the basic graphics package, through which all display screen refresh takes place. The same interface can be used to draw on gray-scale or color displays, or to produce Interpress masters or PD files (a printer-dependent format file similar to bandlists) for a variety of different printers. The Interpress interpreter uses the Imager to perform all of its imaging operations; consequently an Interpress master may be displayed on any of the devices supported by the Imager with equal ease. Similarly, programs that use the Imager can produce output directly on the screen or into an Interpress master, using the same composition code. Programs may also call on the interpreter to render a fragment of Interpress into an Imager context; this is useful for displaying Interpress fragments embedded in editable document, for example.
There are at least two important abstractions in the Imager, the context and the device. A context is similar to a file handle or a capability in an operating system, but instead of being an abstraction for reading or writing data blocks it is an abstraction for executing imaging operations. The client asks for a context with certain properties, such as media size and resolution, or just by name, like the color display or an Interpress master named "Foo.Interpress". All imaging operators take a context as parameter, and do whatever the implementation of the context has specified. The client does not know or care how the context actually works, and the client can execute exactly the same imaging code using different contexts to get different renderings of the same image. The client can modify the transformation within the context to establish any coordinate system the client wishes to employ.
A device, not to be confused with a physical device like a printer or display, is a similar concept at a lower level. Devices are also abstract objects and they are often associated with a context. The context implementation will decompose high level calls, such as MoveTo, CurveTo, MaskStroke, or MaskFill, into a set of simpler operations, such as MaskRuns or MaskPixels, which the device provides in a device specific way and in the device coordinate system. The context implementation is not concerned with the way a particular device implements its own abstraction, but it is the context implementation which must convert from client coordinates to device coordinates and must only use a set of simpler operations which the context in fact implements. Device implementations have the "option" of providing only a subset of the possible device operations, leaving it up to the context implementation to properly decompose the high level calls.
[IPArch] is a document describing the architecture of the Interpress Interpreter and the Imager. It contains an enumeration of the Cedar interfaces which make up these packages, and a discussion of various tools that these packages provide for client wishing to implement new contexts and devices.
Cedar and Mesa
As mentioned in the introduction, our Interpress implementation is written in Cedar. Since Cedar is a derivative of Mesa, it is natural to consider the possibility of porting the implementation into Mesa; this section is concerned with some of the issues involved.
The primary feature of Cedar that is not in Mesa is reference-counted, garbage-collected storage. This is used throughout Interpress and the Imager. The Cedar type REF is a special long pointer to such collectable storage. In many cases explicit FREEs could be put in without a great deal of trouble, but where structures are shared, this becomes difficult to do correctly. A better approach (assuming that Interpress printing is the interesting case) is to take advantage of the limited scope of documents and pages: it is fairly easy to predict, when a given unit of storage is allocated, whether it should persist to the end of the current page, to the end of the current document, or indefinitely. Thus zones can be used for the management of storage, provided that it is possible to release a whole zone at once.
Another Cedar facility is run-time type discrimination: a REF ANY may be used in a Cedar program to point to an object of any type; before the object can be accessed, it is necessary to NARROW the REF ANY into a REF to the particular type of object. There are two different styles of using REF ANY; one use, in object-style programming, is simply to point at the class-specific data. This use is easy to translate, since (barring disaster) the class procedures always know what particular type they are expecting; thus the REF ANY can become a LONG POINTER, and the NARROW can become a LOOPHOLE. The other use is where the particular type is not known in advance. The major use of this kind of REF ANY is for the implementation of Interpress Values. But since the set of types of Interpress Values is static, it is reasonable to define a variant record structure that contains all the possibilities.
A third issue, relating to runtime support rather than the languages, is the use of floating-point arithmetic. Floating-point is microcoded in all existing Cedar environments, whereas it is done in software in most Mesa environments. The Imager uses floating-point pervasively, although fixed-point is used in many of the critical loops. The provision of floating-point hardware or microcode is clearly desirable, but it would be interesting to know how much the use of software support would slow things down.
Elements of this study
Input: sample digital contours.
There were two digital map data sources available when we began this test. The first map, named ContourFiltered.IP, consists of approximately 1500 contours (Figure 1). The contours are encoded as an Interpress master from source data using straight line encoding which mimics the original data. The total size of the contour master is 2,313,944 bytes. The second map, named Greendale.IP, was made by drawing a typical map block using an interactive shape editor [Griffin] (Figure 2), converting that block to an Interpress master, then replicating that block 20 times within the master. The elements in the map block include contours, ground cover, drainage, open water, topographic reference points, roads, and text. The original Greendale master contains 50 filled regions, 128 curves representing contours, roads, and topographic elements, and 8 text strings. The total size of the replicated Greendale master (Figure 3) is 55,429 bytes.
Michael Plass invented a random map generator, and a third map was created, called RandomMap-1 (Figure 4). RandomMap-1 is a 191,743 byte file. It contains 136 closed curves which encode contours and terrain patches.
Environment: Dorado, Cedar, Imager, Interpress.
The study was first executed on a Dorado running Cedar. This particular Dorado contains 8 MBytes of real memory and a 315 MByte disk drive. That is sufficient real memory that memory paging activity is negligible. Almost the entire task is processor (CPU) bound. The latest version of the Imager software package and Interpress software package were used; these versions are slightly improved versions of the currently released versions and will become a part of the next Cedar release (Cedar6.1). There was no user interaction with the system while the test was running.
Tools: The Cedar Spy.
The Cedar Spy [SpyDoc] is the main tool for monitoring the performance of programs. It can measure several different aspects of performance: CPU usage, page faults, allocations, or process time. The main paradigm of Spy is to record the call stack of interesting processes. The definition of interesting varies according to what the user wishes to measure. The uses also chooses, by setting Spy start and end breakpoints in code, the exact places in the execution stream that the Spy should monitor. Spy thus factors out other process activity and concentrates only on the task of interest, in this case the master interpretation and scan conversion. The Spy user documentation is included in this report [SpyDoc]. Since the output from Spy, called Spy logs, is the main method by which this study was done, the reader may wish to become acquainted with the section in the document on Interpreting The Results (page 4).
Imaging vs. Interpretation experiments
We observe that that there are two interacting processes at work; there is reading, parsing, and executing the Interpress master by the Interpreter and there is graphics processing and scan conversion by the Imager. We first factored out the Imager by creating a null Imager context; i.e. a context that did no actual imaging or scan conversion. We then instructed the Spy to monitor CPU utilization while executing the Interpreter for each map file, using the null context. The raw results appear in APPENDIX A. The first set of lines in each appendix entry record the exact commands that were used to initialize and start the test, followed by the Spy log produced after the test was completed. By observing the log, we can see what percentage of time the Interpreter spent in which procedures, and thus allocate the time spent to the activities which actually consumed the time. In the very first entry in APPENDIX A, for example, approximately 12% of the run time was spent in the storage collector, and approximately 78% of the time in the Interpreter. The remaining 10% was in other processes, not of interest here. Of the 78% Interpreter time, nearly 20% of that time was spent in the "GetToken" routine; i.e. reading the master from the file stream. By following the sequences in the spy log, other routines of interest can be investigated.
To measure the time spent in the Imager we ran the same experiments with a context that produced a PD file. PD [5] files are low level device dependent representations of image pages, so we can consider a PD file a close approximation to a raw pixel map or bitmap for a separation. The PD device used represents a four color thermal printing device with a resolution of 400 spots per inch. It is felt that the thermal printer is a representative proof printing device. We ran the ContourFiltered master through as a single separation, and the Greendale and RandomMap masters as four process color separations. In each case, the time addtional to the first test is attributed to the Imager and the output of the PD file to disk. The raw results appear as Spy logs in APPENDIX B.
The basic results are:
 Without imaging With Imaging Difference Ratio
Contour 00:06:36  01:44:28  ~01:38:00 1:16
Greendale 00:02:12 00:30:02 00:27:50 1:14
RandomMap-1 00:00:12 00:22:28  00:22:16 1:112
Briefly, the results show the bulk of the time spent within the Imager. PD file writing consumes around 14% of that time for Contour, 20% of the time for Greendale, and about 50% of the time for RandomMap. In Random Map, the PD code does more of the actual imaging, and time is spent imaging colors (shades and tints) through complex clipping regions.
Dorado/Cedar architecture experiments
One of the goals of this study is to try to factor out the elements of the Dorado/Cedar architecture that impact the implementation of a system such as Interpress/Imager. Some of these architectural elements include:
Automatic storage management
Floating point instructions implemented in microcode
BITBLT implemented in microcode
Large virtual and real memories
The above discussion on Cedar vs. Mesa has qualitatively addressed some of these issues. At least one of them was amenable to quantitative analysis, that being the presence of floating point microcode versus floating point operations implemented as high level Cedar procedures. We rolled a version of the Cedar microcode without floating point operations, and ran another test on a smaller sample of representative map data. Raw results appear in APPENDIX C. The version with floating point ran nearly nine times faster than the version without floating point.
The results are:
 With FP Without FP Difference Ratio
SmallGreendale 00:05:08 00:42:34 00:37:26 1:8.3
With respect to automatic storage management, the Spy logs indicate that there are a few crucial spots in which storage allocation is performed, and these places can be tuned to eliminate almost all of the storage allocation by using buffer pool strategies managed in the program itself. In general, storage management can be dealt with by either providing automatic management in the system or by enforcing a careful discipline in programming style. In the Cedar environment of loosely cooperating processes the automatic management is necessary, but if one were to implement a dedicated system on a network server, much simpler non-automatic strategies can work. All of the XDE systems, including Star and Viewpoint as well as NS, have to enforce such a discipline, so we can see that it is possible even for large systems. Although we use automatic storage management in our prototypes, we do not consider it essential for implementing servers. The time to allocate non-managed storage is comparable to the same time for managed storage, and the time to free unmanaged storage is considerably less, given that no collector process has to be invoked. APPENDIX D indicates that, by raising a storage buffer caching limit so that no storage is returned, a 20% improvement in processing time for RandomMap was obtained.
There was no way to "turn off" BITBLT in the microcode, but we know that for complex synthetic objects such as contours and filled shapes little use is made of the generality of BITBLT. In fact, almost all BITBLT operations are for transferring a single scanline (BBHeight = 1). So, it would be possible to implement a much less general version of BITBLT that dealt with only one line at a time, and still achieve good performance. In fact, such an operator, called HBLT, was developed for the Alto environment late in its life as image intensive programs began to appear.
Finally, with respect to the availability of virtual and real memory space, one could imagine building such a system in a non-virtual environment, but it is important to have sufficient real memory to eliminate contention among the system, the application, and the image buffers. Memory is cheap, and useful, too.
Summary
We observe that the bulk of the time is spent in the scan conversion and image output, with relatively little time in reading and parsing the masters. We also observe that the Imager is a floating point based system, and floating point assist in the form of microcode or hardware is necessary for reasonable performance. The total time spent in processing or the time for input vs. scan conversion vs. output is very dependent on the input content; concocting experiments to determine time per halftone area or time per "typical contour" could be done, but is probably not representative of an actual mix of map data. Other tradeoffs, such as time vs. image resolution, could be analyzed with the same techniques used here by substituting different PD devices and rerunning tests. Other tests, such as the ability of the Imager to handle unique map symbology, remain for the future. We have no reason to doubt the Imager ability to handle symbology of this type; it is a matter of choosing an encoding for the symbols that needs attention.
References
[1] B. Lampson, D. Clark, K. Pier, S. Ornstein, G. McDaniel,
The Dorado: A High-Performance Personal Computer: Three Papers. Xerox PARC report CSL-81-1, January, 1981. Enclosed.
[2] T. M. Holladay,
An Optimum Algorithm for Halftone Generation for Displays and Hard Copies
Proceedings of the Society for Information Display, Vol. 21 No. 2, 1980. pages 185-192.
[4] M. F. Plass, Peach PD printers and how to use them.
[indigo]<Peach>Documentation>PeachDoc.tioga. Enclosed.
[5] K. Pier and R. Sproull, Printing Device Format.
[Indigo]<PD>Docs>PDFormat.press. Enclosed.
[6] R. Sproull, PD Printer Operation.
(Alto BCPL version) [Indigo]<PD>Docs>PDPrintOps.press. Enclosed.
[7] R. Sproull, W. Newman, and J. Maleson, Press File Format
[Indigo]<PrintingDocs>PressFormat.press. Enclosed.
[9] J. Warnock and D. K. Wyatt,
A Device Independent Graphics Imaging Model For Use with Raster Devices.
Computer Graphics Vol 16, No. 3 July 1982
[SIGGRAPH 82 proceedings]
[Thacker] C.P. Thacker et. al.,
Alto: A Personal Computer. In Computer Structures: Readings and Examples, 2nd edition, Sieworek, Bell and Newell, eds., McGraw-Hill, 1981.
[Johnsson] R.K. Johnsson and J.D. Wick
An Overview of the Mesa Processor Architecture. Proc. Symp. on Architectural Support for Programming Languages and Operating Systems, SigAarch/SigPLAN, Palo Alto, CA, March 1982. 20-29.
[Masinter] L. Masinter and W. Teitelman
The Interlisp Programming Environment. Computer 14, 4, April 1981, 25-33.
[Goldberg] A. Goldberg and D. Robson
Smalltalk-80: The Language and its Implementation, McGraw-Hill, 1983.
[Swinehart] D. Swinehart, P. T. Zellweger and R. B. Hagmann
The Structure of Cedar. Proc. of ACM SigPLAN 85 Symposium on Programming Languages and Programming Environments, June 1985.
[Teitelman] W. Teitelman
A Tour Through Cedar. IEEE Software, April 1984.
[Beach] R. Beach
Experience with the Cedar Programming Environment for Computer Graphics Research. Graphic Interface 84.
[IPStandard] Xerox Corporation
Interpress Electronic Printing Standard, Version 2.1. Xerox System Integration Guide 048402, February 1984.
[IPIntro] R. Sproull and B. Reid
Introduction to Interpress. Xerox System Integration Guide 038306, June 1983.
[IPArch] M. Plass Research Interpress Architecture
[Cyan]<Imaging>Documentation>ResearchInterpressArchitecture.tioga. Enclosed.
[Griffin] M. Stone and K. Pier
Cedar Griffin
[Cedar]<CedarChest6.0>Documentation>GriffinDoc.tioga. Enclosed.
[SpyDoc] J. Maxwell
Documentation for the Cedar Spy.
[Cedar]<CedarChest6.0>Documentation>SpyDoc.tioga. Enclosed.
APPENDIX A
DATA FOR Greendale Master
Experiment: First GDNullTest. No Spy. KAP. December 11, 1985 6:31:39 pm PST
% @GDNullTest
[[///Commands/statistics on]]
Statistics on.
[[///Commands/date]]
Wednesday, December 11, 1985 6:24 pm PST
{0.04 seconds, 126 words}
[[///Commands/Run IPTestPackage]]
Previously loaded and run: []<>DIPPSY>IPTestPackage.bcd!3
{0.11 seconds, 538 words}
[[///Commands/← &c ← ImagerNullImpl.Create[]]]
^[class: 1675132B^, state: NIL, data: 7445222B^, propList: NIL]
{0.64 seconds, 16166 words}
[[///Commands/← &m ← IPExecImpl.Open[fileName: "Greendale.Interpress", logProc: NIL, logData: NIL]]]
^[pages: 1, skeleton: 7311176B^, logProc: NIL, logData: NIL, impl: 11706152B^]
{2.36 seconds, 7922 words}
[[///Commands/← IPExecImpl.DoPage[master: &m, page: 1, context: &c]]]
{00:02:12 seconds, 1063136 words}
Now with the spy:
Open ImagerNullImpl.mesa and set spy break at 4208, 4308
% -- GDNullTest with Spy. KAP
% @GDNullTest
[[///Commands/statistics on]]
Statistics on.
[[///Commands/date]]
Wednesday, December 11, 1985 7:12 pm PST
{0.04 seconds, 106 words}
[[///Commands/Run IPTestPackage]]
Previously loaded and run: []<>DIPPSY>IPTestPackage.bcd!3
{0.10 seconds, 516 words}
[[///Commands/← &c ← ImagerNullImpl.Create[]]]
^[class: 1675132B^, state: NIL, data: 7450062B^, propList: NIL]
{1.22 seconds, 5098 words}
[[///Commands/← &m ← IPExecImpl.Open[fileName: "Greendale.Interpress", logProc: NIL, logData: NIL]]]
^[pages: 1, skeleton: 7322716B^, logProc: NIL, logData: NIL, impl: 7523656B^]
{3.84 seconds, 31458 words}
[[///Commands/← IPExecImpl.DoPage[master: &m, page: 1, context: &c]]]

{00:03:19 seconds, 1069856 words, 545 page faults}
---------------------------------------------------------------
Cedar Spy of: December 11, 1985 7:08:59 pm PST.
Executed at: December 11, 1985 7:16:31 pm PST.
Measuring CPU usage.
(Waking up on vertical retrace. (80 times a second))

Start Breaks: NullDoSave [source: 4208].
Stop Breaks: NullDoSave [source: 4308].
1 start breaks encountered.
1 stop breaks encountered.

(Please wait-- processing log.)

Spy ran for 3 minutes 19 seconds.
Total wakeups = 15432 (77 per second).
Total page faults = 545 (2 per second).
Total words allocated = 1068274 (5368 per second).
Total words reclaimed = 1049596 (5274 per second).

Scheduled Process-Priority Summary:
processor idle = 332 (2.1%).
priority background = 1692 (10.9%).
priority normal = 13055 (84.5%).
priority foreground = 304 (1.9%).
priority pagefaultHigh = 46 (0.2%).
priority interrupt = 3 (0.1%).

Instructions (see SpyDoc.tioga for more information):
 Indentation is used to show containment.
 Periods are used to keep track of procedures at the same level of indentation.
 Exclamation points (!) are used to group together sets of disjoint procedures.
 Italics are used to indicate procedures with more than one parent.
 Bold is used to indicate procedures which actually had allocations or page faults.
 Impl.Proc = x, y (o%) (z%):
  x = counts in Impl.Proc.
  y = counts in procedures called from Impl.Proc.
  o = x/ total % (only displayed if > 1%).
  z = (x + y)/ total = % time IN THE CALL STACK.

Statistics on execution of Cedar Spy:
 Total samples read from log = 15432.
 3 SAMPLES WITH STACKS OF >= 75 FRAMES!
 Average stack depth = 104.
 No. modules allocated = 110.
 No. procedures allocated = 589.
 Total words allocated = 18466.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Breakdown of interesting processes.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Process 311B running at priority [normal, foreground, interrupt] = 12174 (78.8%).
CommandToolImpl.CommandToolBase = 12171 (78.8%).

Process 365B running at priority [background, normal] = 1792 (11.6%).
CollectorImpl.BackgroundCollector = 1792 (11.6%).

Process 313B running at priority [normal] = 512 (3.3%).
Watch.Watcher = 512 (3.3%).

Process 353B running at priority [foreground] = 180 (1.1%).
SpyLogImpl.WriteBuffer = 180 (1.1%).

Assorted processes = 442 (2.8%).

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Breakdown of interesting procedures.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

CommandToolImpl.CommandToolBase (1 refs) = 0, 12171 (78.8%).
! (19831) ProcessPropsImpl.PushPropList = 12171 (78.8%).
!
! ProcessPropsImpl.PushPropList (1 refs) = 0, 12171 (78.8%).
! (821) InterpreterPrivateImpl.inner = 12171 (78.8%).
!
! InterpreterPrivateImpl.inner (1 refs) = 0, 12171 (78.8%).
! (1667) EvaluateImpl.EvalNoProps = 12171 (78.8%).
!
! EvaluateImpl.EvalNoProps (1 refs) = 0, 12171 (78.8%).
! (5876) EvaluateImpl.EvalNode = 12171 (78.8%).
!
! EvaluateImpl.EvalNode (1 refs) = 0, 12171 (78.8%).
! (8677) EvaluateImpl.EvalApply = 12171 (78.8%).
!
! EvaluateImpl.EvalApply (1 refs) = 0, 12171 (78.8%).
! (27716) EvaluateImpl.DoApply = 12171 (78.8%).
!
! EvaluateImpl.DoApply (1 refs) = 0, 12171 (78.8%).
! (26043) EvaluateImpl.CallIt = 12171 (78.8%).
!
! EvaluateImpl.CallIt (1 refs) = 0, 12171 (78.8%).
! (25606) AMEventsImpl.Apply = 12171 (78.8%).
!
! AMEventsImpl.Apply (1 refs) = 0, 12171 (78.8%).
! (25386) IPExecImpl.DoPage = 12171 (78.8%).
!
! IPExecImpl.DoPage (1 refs) = 0, 12171 (78.8%).
! (14347) IPExecImpl.DoTopAction = 12171 (78.8%).
!
! IPExecImpl.DoTopAction (1 refs) = 0, 12171 (78.8%).
! (12699) IPErrorImpl.AddMaster = 12171 (78.8%).
!
! IPErrorImpl.AddMaster (1 refs) = 0, 12171 (78.8%).
! (530) ProcessPropsImpl.AddPropList = 12171 (78.8%).
!
! ProcessPropsImpl.AddPropList (1 refs) = 0, 12171 (78.8%).
! (600) IPExecImpl.save = 12171 (78.8%).
!
! IPExecImpl.save (1 refs) = 0, 12171 (78.8%).
! (12674) IPContextImpl.DoSaveAll = 12171 (78.8%).
!
! IPContextImpl.DoSaveAll (1 refs) = 0, 12171 (78.8%).
! (2383) ImagerImpl.DoSaveAll = 12171 (78.8%).
!
! ImagerImpl.DoSaveAll (1 refs) = 0, 12171 (78.8%).
! (1924) ImagerNullImpl.NullDoSave = 12171 (78.8%).
!
! ImagerNullImpl.NullDoSave (1 refs) = 17, 12154 (78.8%).
! (4259) IPExecImpl.call = 155 (1.0%).
! (4259) IPBaseImpl.action = 11912 (77.1%).
!
! IPExecImpl.Do (2 refs) = 6, 541 (3.5%).
! (10713) IPImagerImpl.ColorOperatorDo = 293 (1.8%).
! (10713) IPImagerImpl.ColorModelOperatorDo = 161 (1.0%).
!
! IPBaseImpl.action (1 refs) = 2, 11910 (77.1%).
! . (2737) IPExecImpl.CallInlineBody = 11910 (77.1%).
! .
! IPExecImpl.CallInlineBody (2 refs) = 5, 11988 (77.7%).
! . (9959) IPContextImpl.Call = 11988 (77.6%).
! .
! IPContextImpl.Call (2 refs) = 11, 12132 (78.6%).
! (1297) IPExecImpl.action = 12103 (78.4%).
!
! IPExecImpl.action (1 refs) = 2, 12101 (78.4%).
! (9932) IPExecImpl.ExecuteInlineBody = 12101 (78.4%).
!
! IPExecImpl.ExecuteInlineBody (1 refs) = 6, 12095 (78.4%).
! (9151) IPExecImpl.ExecuteToEndOfBody = 12058 (78.1%).
!
! IPExecImpl.ExecuteToEndOfBody (1 refs) = 926, 11132 (6.0%) (78.1%).
! . (7628) IPMasterImpl.GetToken = 2970 (19.2%).
! . (8126) IPExecImpl.FinishSequence = 2129 (13.7%).
! . (8285) IPApplyImpl.Apply = 4155 (26.9%).
! . (8342) IPStackImpl.PushNum = 346 (2.2%).
! . (8410) IPExecImpl.BeginSequence = 165 (1.0%).
! . (8410) IPExecImpl.ExtendSequence = 1366 (8.8%).
! .
! . IPApplyImpl.Apply (1 refs) = 76, 4079 (26.9%).
! . ! (4510) IPBaseImpl.ApplyMAKESIMPLECO = 155 (1.0%).
! . ! (4510) IPBaseImpl.ApplyDO = 501 (3.2%).
! . ! (4510) IPImageImpl.ApplyFINDCOLORMODELOPERATOR = 477 (3.0%).
! . ! (4510) IPBaseImpl.ApplyMAKEVEC = 585 (3.7%).
! . ! (4510) IPBaseImpl.ApplyFSET = 629 (4.0%).
! . ! (4510) IPImageImpl.ApplyCURVETO = 877 (5.6%).
! . ! (4510) IPImageImpl.ApplyMASKSTROKE = 239 (1.5%).
! . !
! . ! IPImageImpl.ApplyCURVETO (1 refs) = 81, 796 (5.6%).
! . ! ! (14505) IPImageImpl.PopVec = 251 (1.6%).
! . ! ! (14529) IPImageImpl.PopVec = 241 (1.5%).
! . ! ! (14553) IPStackImpl.ExtendTrajectory = 167 (1.0%).
! . ! !
! . ! IPBaseImpl.ApplyFSET (1 refs) = 6, 623 (4.0%).
! . ! ! (2080) IPContextImpl.FSet = 612 (3.9%).
! . ! !
! . ! ! IPContextImpl.FSet (1 refs) = 14, 598 (3.9%).
! . ! ! (2027) IPVectorImpl.ArrayFromVector = 598 (3.8%).
! . ! !
! . ! ! IPVectorImpl.ArrayFromVector (1 refs) = 202, 396 (3.8%).
! . ! ! (6681) IPVectorImpl.Get = 356 (2.3%).
! . ! !
! . ! IPBaseImpl.ApplyMAKEVEC (1 refs) = 24, 561 (3.7%).
! . ! ! (1148) IPVectorImpl.MakeVec = 423 (2.7%).
! . ! !
! . ! IPBaseImpl.ApplyDO (1 refs) = 11, 490 (3.2%).
! . ! ! (2326) IPExecImpl.Do = 460 (2.9%).
! . ! !
! . ! IPImageImpl.ApplyFINDCOLORMODELOPERATOR (1 refs) = 8, 469 (3.0%).
! . ! . (12420) IPImagerImpl.FindColorModelOperator = 418 (2.7%).
! . ! .
! . ! IPImageImpl.PopVec (6 refs) = 175, 500 (4.3%).
! . ! . (3432) IPStackImpl.PopReal = 255 (1.6%).
! . ! . (3453) IPStackImpl.PopReal = 245 (1.5%).
! . ! .
! . ! IPStackImpl.PopReal (5 refs) = 351, 162 (2.2%) (3.3%).
! . !
! . IPExecImpl.FinishSequence (1 refs) = 141, 1988 (13.7%).
! . ! (6213) IPExecImpl.DoIdentifier = 280 (1.8%).
! . ! (6301) IPExecImpl.DoRational = 1708 (11.0%).
! . !
! . ! IPExecImpl.DoRational (1 refs) = 443, 1265 (2.8%) (11.0%).
! . ! (1982) IPMasterImpl.IntFromSequenceData = 392 (2.5%).
! . ! (2054) IPMasterImpl.IntFromSequenceData = 372 (2.4%).
! . ! (2167) IPStackImpl.PushNum = 250 (1.6%).
! . ! (2210) IPStackImpl.PushNum = 251 (1.6%).
! . !
! . ! IPMasterImpl.IntFromSequenceData (2 refs) = 764 (4.9%).
! . !
! . IPExecImpl.ExtendSequence (1 refs) = 335, 1031 (2.1%) (8.8%).
! . . (5622) IOCommonImpl.GetBlock = 1031 (6.6%).
! . .
! . . IOCommonImpl.GetBlock (1 refs) = 117, 914 (6.6%).
! . . (10513) FileStreamImpl.GetBlock = 914 (5.9%).
! . .
! . . FileStreamImpl.GetBlock (1 refs) = 504, 410 (3.2%) (5.9%).
! . . (5146) InstructionsImpl.ByteBlt = 393 (2.5%).
! . .
! . IPStackImpl.PushNum (3 refs) = 274, 573 (5.4%).
! . (2096) IPStackImpl.PushStack = 429 (2.7%).
! .
! IPMasterImpl.GetToken (3 refs) = 1049, 2057 (6.7%) (20.1%).
! . (19025) IOCommonImpl.GetIndex = 673 (4.3%).
! . (19059) IOCommonImpl.GetChar = 754 (4.8%).
! . (19113) IOCommonImpl.GetChar = 227 (1.4%).
! . (19373) IOCommonImpl.GetChar = 255 (1.6%).
! .
! . IOCommonImpl.GetChar (4 refs) = 395, 989 (2.5%) (8.9%).
! . (10341) FileStreamImpl.GetChar = 989 (6.4%).
! .
! . FileStreamImpl.GetChar (1 refs) = 986, 3 (6.3%) (6.4%).
! .
! IOCommonImpl.GetIndex (2 refs) = 276, 407 (4.4%).
! (12265) FileStreamImpl.GetIndex = 407 (2.6%).
!
CollectorImpl.BackgroundCollector (1 refs) = 0, 1792 (11.6%).
! (4817) ZCTImpl.ScanTheFrameHeap = 572 (3.7%).
! (4849) ZCTImpl.MapReclaimableObjects = 1135 (7.3%).
!
! ZCTImpl.MapReclaimableObjects (1 refs) = 39, 1096 (7.3%).
! ! (5290) ReclaimerImpl.Reclaim = 926 (6.0%).
! !
! ! ReclaimerImpl.Reclaim (1 refs) = 334, 592 (2.1%) (6.0%).
! ! (2599) RCMapWalkerImpl.DoFREEify = 261 (1.6%).
! ! (2617) AllocatorImpl.FreeObject = 272 (1.7%).
! !
! ZCTImpl.ScanTheFrameHeap (1 refs) = 0, 572 (3.7%).
! (4440) RTFrameHeapSnapshotImpl.MapUncountedBodies = 491 (3.1%).
!
! RTFrameHeapSnapshotImpl.MapUncountedBodies (1 refs) = 20, 471 (3.1%).
! (1207) ZCTImpl.ConservativeScanner = 471 (3.0%).
!
! ZCTImpl.ConservativeScanner (1 refs) = 352, 119 (2.2%) (3.0%).
!
Watch.Watcher (1 refs) = 8, 504 (3.3%).
. (28483) VMAllocImpl.Allocate = 181 (1.1%).
.
AllocatorImpl.NewSystemObject (17 refs) = 422, 260 (2.7%) (4.4%).
(9534) StorageAccountingImpl.ConsiderCollection = 256 (1.6%).


The remaining procedures had less than 462 wakeups.
APPENDIX A
DATA FOR ContourFiltered Master
Experiment: Time ContourFiltered painting to null imager. No Spy running.
% @Test3
[[///Commands/Date]]
Wednesday, December 11, 1985 3:19 pm PST
{0.05 seconds, 192 words}
[[///Commands/Run IPTestPackage]]
Ran: []<>dippsy>IPTestPackage.bcd!6
{2.22 seconds, 14151 words, 6 page faults}
[[///Commands/← &c ← ImagerNullImpl.Create[]]]
^[class: 11146472B^, state: NIL, data: 7363562B^, propList: NIL]
{1.66 seconds, 22240 words}
[[///Commands/← &m ← IPExecImpl.Open[fileName: "ContourFiltered.ip", logProc: NIL, logData: NIL]]]
^[pages: 1, skeleton: 11152274B^, logProc: NIL, logData: NIL, impl: 7316232B^]
{00:01:59 seconds, 17198 words}
[[///Commands/← IPExecImpl.DoPage[master: &m, page: 1, context: &c]]]
{00:06:36 seconds, 4919866 words}
Experiment: Time ContourFiltered painting to null imager with Spy running.
Open ImagerNullImpl.mesa and set spy break at 4208, 4308
% @CFNullTest
[[///Commands/statistics on]]
Statistics on.
[[///Commands/date]]
Friday, December 13, 1985 5:11 pm PST
{0.06 seconds, 106 words}
[[///Commands/Run IPTestPackage]]
Previously loaded and run: [Cyan]<Imaging>Dippsy>IPTestPackage.bcd!1
{0.14 seconds, 732 words}
[[///Commands/← &c ← ImagerNullImpl.Create[]]]
^[class: 1675222B^, state: NIL, data: 7450062B^, propList: NIL]
{1.02 seconds, 4872 words}
[[///Commands/← &m ← IPExecImpl.Open[fileName: "ContourFiltered.ip", logProc: NIL, logData: NIL]]]
^[pages: 1, skeleton: 7304122B^, logProc: NIL, logData: NIL, impl: 7523612B^]
{00:01:59 seconds, 32780 words}
[[///Commands/← IPExecImpl.DoPage[master: &m, page: 1, context: &c]]]
{00:07:53 seconds, 4920626 words}
==========================================================
Cedar Spy of: December 12, 1985 10:51:34 am PST.
Executed at: December 13, 1985 5:25:45 pm PST.
Measuring CPU usage.
(Waking up on vertical retrace. (80 times a second))

Start Breaks: NullDoSave [source: 4208].
Stop Breaks: NullDoSave [source: 4308].
1 start breaks encountered.
1 stop breaks encountered.

(Please wait-- processing log.)

Spy ran for 7 minutes 52 seconds.
Total wakeups = 36614 (77 per second).
Total page faults = 0 (0 per second).
Total words allocated = 4919024 (10421 per second).
Total words reclaimed = 4888374 (10356 per second).

Scheduled Process-Priority Summary:
priority background = 6261 (17.1%).
priority normal = 29851 (81.5%).
priority foreground = 464 (1.2%).
priority pagefaultHigh = 38 (0.1%).

Instructions (see SpyDoc.tioga for more information):
 Indentation is used to show containment.
 Periods are used to keep track of procedures at the same level of indentation.
 Exclamation points (!) are used to group together sets of disjoint procedures.
 Italics are used to indicate procedures with more than one parent.
 Bold is used to indicate procedures which actually had allocations or page faults.
 Impl.Proc = x, y (o%) (z%):
  x = counts in Impl.Proc.
  y = counts in procedures called from Impl.Proc.
  o = x/ total % (only displayed if > 1%).
  z = (x + y)/ total = % time IN THE CALL STACK.

Statistics on execution of Cedar Spy:
 Processed log in 295.269 seconds. Total samples read from log = 36614.
 Average stack depth = 42.
 No. modules allocated = 92.
 No. procedures allocated = 399.
 Total words allocated = 12534.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Breakdown of interesting processes.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Process 311B running at priority [normal] = 29361 (80.1%).
CommandToolImpl.CommandToolBase = 29361 (80.1%).

Process 365B running at priority [background, normal] = 6455 (17.6%).
CollectorImpl.BackgroundCollector = 6455 (17.6%).

Assorted processes = 798 (2.1%).

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Breakdown of interesting procedures.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

CommandToolImpl.CommandToolBase (1 refs) = 0, 29361 (80.1%).
! (19831) ProcessPropsImpl.PushPropList = 29361 (80.1%).
!
! ProcessPropsImpl.PushPropList (1 refs) = 0, 29361 (80.1%).
! (821) InterpreterPrivateImpl.inner = 29361 (80.1%).
!
! InterpreterPrivateImpl.inner (1 refs) = 0, 29361 (80.1%).
! (1667) EvaluateImpl.EvalNoProps = 29361 (80.1%).
!
! EvaluateImpl.EvalNoProps (1 refs) = 0, 29361 (80.1%).
! (5876) EvaluateImpl.EvalNode = 29361 (80.1%).
!
! EvaluateImpl.EvalNode (1 refs) = 0, 29361 (80.1%).
! (8677) EvaluateImpl.EvalApply = 29361 (80.1%).
!
! EvaluateImpl.EvalApply (1 refs) = 0, 29361 (80.1%).
! (27716) EvaluateImpl.DoApply = 29361 (80.1%).
!
! EvaluateImpl.DoApply (1 refs) = 0, 29361 (80.1%).
! (26043) EvaluateImpl.CallIt = 29361 (80.1%).
!
! EvaluateImpl.CallIt (1 refs) = 0, 29361 (80.1%).
! (25606) AMEventsImpl.Apply = 29361 (80.1%).
!
! AMEventsImpl.Apply (1 refs) = 0, 29361 (80.1%).
! (25386) IPExecImpl.DoPage = 29361 (80.1%).
!
! IPExecImpl.DoPage (1 refs) = 0, 29361 (80.1%).
! (14347) IPExecImpl.DoTopAction = 29361 (80.1%).
!
! IPExecImpl.DoTopAction (1 refs) = 0, 29361 (80.1%).
! (12699) IPErrorImpl.AddMaster = 29361 (80.1%).
!
! IPErrorImpl.AddMaster (1 refs) = 0, 29361 (80.1%).
! (530) ProcessPropsImpl.AddPropList = 29361 (80.1%).
!
! ProcessPropsImpl.AddPropList (1 refs) = 0, 29361 (80.1%).
! (600) IPExecImpl.save = 29361 (80.1%).
!
! IPExecImpl.save (1 refs) = 0, 29361 (80.1%).
! (12674) IPContextImpl.DoSaveAll = 29361 (80.1%).
!
! IPContextImpl.DoSaveAll (1 refs) = 0, 29361 (80.1%).
! (2383) ImagerImpl.DoSaveAll = 29361 (80.1%).
!
! ImagerImpl.DoSaveAll (1 refs) = 0, 29361 (80.1%).
! (1924) ImagerNullImpl.NullDoSave = 29361 (80.1%).
!
! ImagerNullImpl.NullDoSave (1 refs) = 0, 29361 (80.1%).
! (4259) IPExecImpl.call = 29361 (80.1%).
!
! IPExecImpl.call (1 refs) = 0, 29361 (80.1%).
! (12582) IPContextImpl.Call = 29361 (80.1%).
!
! IPContextImpl.Call (1 refs) = 0, 29361 (80.1%).
! (1297) IPExecImpl.action = 29361 (80.1%).
!
! IPExecImpl.action (1 refs) = 0, 29361 (80.1%).
! (9932) IPExecImpl.ExecuteInlineBody = 29361 (80.1%).
!
! IPExecImpl.ExecuteInlineBody (1 refs) = 0, 29361 (80.1%).
! (9151) IPExecImpl.ExecuteToEndOfBody = 29361 (80.1%).
!
! IPExecImpl.ExecuteToEndOfBody (1 refs) = 3457, 25904 (9.4%) (80.1%).
! (7628) IPMasterImpl.GetToken = 10655 (29.1%).
! (8285) IPApplyImpl.Apply = 12334 (33.6%).
! (8342) IPStackImpl.PushNum = 2915 (7.9%).
!
! IPApplyImpl.Apply (1 refs) = 295, 12039 (33.6%).
! ! (4510) IPImageImpl.ApplyLINETO = 8919 (24.3%).
! ! (4510) IPImageImpl.ApplyLINETOX = 647 (1.7%).
! ! (4510) IPImageImpl.ApplyMASKSTROKE = 1683 (4.5%).
! ! (4510) IPImageImpl.ApplyLINETOY = 767 (2.0%).
! !
! ! IPImageImpl.ApplyLINETO (1 refs) = 1267, 7652 (3.4%) (24.3%).
! ! ! (14021) IPImageImpl.PopVec = 2055 (5.6%).
! ! ! (14044) IPStackImpl.ExtendTrajectory = 1752 (4.7%).
! ! ! (14107) IPStackImpl.PopTrajectory = 1565 (4.2%).
! ! ! (14144) ImagerPathImpl.LineTo = 1175 (3.2%).
! ! ! (14144) IPStackImpl.PushTrajectory = 1105 (3.0%).
! ! !
! ! IPImageImpl.ApplyMASKSTROKE (1 refs) = 2, 1681 (4.5%).
! ! . (17569) IPImageImpl.MaskStroke = 1681 (4.5%).
! ! .
! ! . IPImageImpl.MaskStroke (1 refs) = 2, 1679 (4.5%).
! ! . (17379) ImagerImpl.MaskStroke = 381 (1.0%).
! ! . (17436) ImagerImpl.MaskStrokeTrajectory = 1287 (3.5%).
! ! .
! ! . ImagerImpl.MaskStrokeTrajectory (1 refs) = 0, 1287 (3.5%).
! ! . . (11749) ImagerNullImpl.NullMaskStroke = 1287 (3.5%).
! ! . .
! ! . ImagerNullImpl.NullMaskStroke (2 refs) = 3, 1665 (4.5%).
! ! . (10059) ImagerNullImpl.CountPath = 1665 (4.5%).
! ! .
! ! . ImagerNullImpl.CountPath (1 refs) = 1, 1664 (4.5%).
! ! . (3664) IPImageImpl.path = 378 (1.0%).
! ! . (3664) ImagerImpl.path = 1286 (3.5%).
! ! .
! ! . ImagerImpl.path (1 refs) = 0, 1286 (3.5%).
! ! . (11614) ImagerPathImpl.MapTrajectory = 1286 (3.5%).
! ! .
! ! . ImagerPathImpl.MapTrajectory (1 refs) = 0, 1286 (3.5%).
! ! . (9128) ImagerPathImpl.Map = 1286 (3.5%).
! ! .
! ! . ImagerPathImpl.Map (1 refs) = 996, 290 (2.7%) (3.5%).
! ! .
! ! IPImageImpl.PopVec (2 refs) = 550, 1513 (5.6%).
! ! ! (3432) IPStackImpl.PopReal = 761 (2.0%).
! ! ! (3453) IPStackImpl.PopReal = 752 (2.0%).
! ! !
! ! IPStackImpl.ExtendTrajectory (2 refs) = 1980 (5.4%).
! ! !
! ! IPStackImpl.PopTrajectory (3 refs) = 220, 1632 (5.0%).
! ! ! (3769) IPStackImpl.PopAny = 1632 (4.4%).
! ! !
! ! ! IPStackImpl.PopAny (1 refs) = 247, 1385 (4.4%).
! ! ! (4541) ImagerPathImpl.TrajectoriesFromPath = 1385 (3.7%).
! ! !
! ! ! ImagerPathImpl.TrajectoriesFromPath (1 refs) = 1, 1384 (3.7%).
! ! ! (10780) ImagerPathImpl.Transform = 1384 (3.7%).
! ! !
! ! ! ImagerPathImpl.Transform (1 refs) = 0, 1384 (3.7%).
! ! ! (6865) IPStackImpl.path = 1383 (3.7%).
! ! !
! ! ! IPStackImpl.path (1 refs) = 0, 1383 (3.7%).
! ! ! (4366) IPStackImpl.DoTopPath = 1383 (3.7%).
! ! !
! ! IPStackImpl.PushTrajectory (2 refs) = 126, 1122 (3.4%).
! ! . (8914) IPStackImpl.PushAny = 1122 (3.0%).
! ! .
! ! IPStackImpl.DoTopPath (2 refs) = 487, 1272 (4.8%).
! ! ! (8349) ImagerPathImpl.TransformLineTo = 1144 (3.1%).
! ! !
! ! ! ImagerPathImpl.TransformLineTo (1 refs) = 185, 959 (3.1%).
! ! ! (5944) ImagerPathImpl.line = 959 (2.6%).
! ! !
! ! IPStackImpl.PopReal (5 refs) = 1610 (4.3%).
! ! !
! ! IPStackImpl.PushAny (2 refs) = 366, 882 (3.4%).
! ! . (1958) AllocatorImpl.NewSystemObject = 882 (2.4%).
! ! .
! ! ImagerPathImpl.LineTo (3 refs) = 630, 1531 (5.9%).
! ! (7204) AllocatorImpl.NewSystemObject = 1531 (4.1%).
! !
! IPMasterImpl.GetToken (1 refs) = 3820, 6835 (10.4%) (29.1%).
! ! (19025) IOCommonImpl.GetIndex = 2361 (6.4%).
! ! (19059) IOCommonImpl.GetChar = 2727 (7.4%).
! ! (19113) IOCommonImpl.GetChar = 1747 (4.7%).
! !
! ! IOCommonImpl.GetChar (2 refs) = 1153, 3321 (3.1%) (12.2%).
! ! ! (10341) FileStreamImpl.GetChar = 3321 (9.0%).
! ! !
! ! ! FileStreamImpl.GetChar (1 refs) = 3311, 10 (9.0%) (9.0%).
! ! !
! ! IOCommonImpl.GetIndex (1 refs) = 730, 1631 (6.4%).
! ! (12265) FileStreamImpl.GetIndex = 1631 (4.4%).
! !
! ! FileStreamImpl.GetIndex (1 refs) = 1631 (4.4%).
! !
! IPStackImpl.PushNum (1 refs) = 837, 2078 (2.2%) (7.9%).
! (2096) IPStackImpl.StackRepFromNum = 534 (1.4%).
! (2096) IPStackImpl.PushStack = 1544 (4.2%).
!
! IPStackImpl.PushStack (1 refs) = 1544 (4.2%).
!
CollectorImpl.BackgroundCollector (1 refs) = 4, 6451 (17.6%).
. (4817) ZCTImpl.ScanTheFrameHeap = 2044 (5.5%).
. (4849) ZCTImpl.MapReclaimableObjects = 4114 (11.2%).
.
. ZCTImpl.MapReclaimableObjects (1 refs) = 335, 3779 (11.2%).
. ! (5290) ReclaimerImpl.Reclaim = 2974 (8.1%).
. ! (5474) ZCTImpl.PullNextEntry = 716 (1.9%).
. !
. ! ReclaimerImpl.Reclaim (1 refs) = 1458, 1516 (3.9%) (8.1%).
. ! (2617) AllocatorImpl.FreeObject = 1510 (4.1%).
. !
. ! AllocatorImpl.FreeObject (2 refs) = 917, 596 (2.5%) (4.1%).
. !
. ZCTImpl.ScanTheFrameHeap (1 refs) = 1, 2043 (5.5%).
. (4440) RTFrameHeapSnapshotImpl.MapUncountedBodies = 1724 (4.7%).
.
. RTFrameHeapSnapshotImpl.MapUncountedBodies (1 refs) = 71, 1653 (4.7%).
. (1207) ZCTImpl.ConservativeScanner = 1653 (4.5%).
.
. ZCTImpl.ConservativeScanner (1 refs) = 1317, 336 (3.5%) (4.5%).
.
AllocatorImpl.NewSystemObject (6 refs) = 1484, 934 (4.0%) (6.6%).
(9534) StorageAccountingImpl.ConsiderCollection = 898 (2.4%).


The remaining procedures had less than 1098 wakeups.
APPENDIX A
DATA FOR Random Map Master
Test without Imager
% @RMNullTest
[[///Commands/statistics on]]
Statistics on.
{0.01 seconds, 160 words}
[[///Commands/date]]
Tuesday, December 17, 1985 12:16 pm PST
{0.06 seconds, 242 words}
[[///Commands/Run IPTestPackage]]
Previously loaded and run: [Cyan]<Imaging>Dippsy>IPTestPackage.bcd!1
{0.15 seconds, 978 words}
[[///Commands/← &c ← ImagerNullImpl.Create[]]]
^[class: 1675222B^, state: NIL, data: 7447642B^, propList: NIL]
{0.24 seconds, 1448 words}
[[///Commands/← &m ← IPExecImpl.Open[fileName: "RandomMap-400.ip", logProc: NIL, logData: NIL]]]
^[pages: 1, skeleton: 5657632B^, logProc: NIL, logData: NIL, impl: 7525636B^]
{3.63 seconds, 32254 words}
[[///Commands/← IPExecImpl.DoPage[master: &m, page: 1, context: &c]]]
{11.43 seconds, 109007 words, 343 page faults}
APPENDIX B
DATA FOR Greendale Master
Experiment: make a PD file for the 400 spot per inch color printer. Monitor for several minutes with Spy.
% InterpressToPD GreendaleAborted.PD.Color400 ← Greendale.Interpress color400
Cedar Spy of: December 12, 1985 10:51:34 am PST.
Executed at: December 12, 1985 1:44:30 pm PST.
Measuring CPU usage.
(Waking up on vertical retrace. (80 times a second))

Start Breaks: InterpressToPDAction [source: 10600].
Stop Breaks:
1 start breaks encountered.
0 stop breaks encountered.

(Please wait-- processing log.)

Spy ran for 2 minutes 6 seconds.
Total wakeups = 9784 (77 per second).
Total page faults = 546 (4 per second).
Total words allocated = 357023 (2833 per second).
Total words reclaimed = 326300 (2589 per second).

Scheduled Process-Priority Summary:
processor idle = 358 (3.6%).
priority background = 392 (4.0%).
priority normal = 8799 (89.9%).
priority foreground = 195 (1.9%).
priority pagefaultLow = 1 (0.1%).
priority pagefaultHigh = 39 (0.3%).

Instructions (see SpyDoc.tioga for more information):
 Indentation is used to show containment.
 Periods are used to keep track of procedures at the same level of indentation.
 Exclamation points (!) are used to group together sets of disjoint procedures.
 Italics are used to indicate procedures with more than one parent.
 Bold is used to indicate procedures which actually had allocations or page faults.
 Impl.Proc = x, y (o%) (z%):
  x = counts in Impl.Proc.
  y = counts in procedures called from Impl.Proc.
  o = x/ total % (only displayed if > 1%).
  z = (x + y)/ total = % time IN THE CALL STACK.

Statistics on execution of Cedar Spy:
 Processed log in 312.710 seconds. Total samples read from log = 9784.
 Average stack depth = 109.
 No. modules allocated = 124.
 No. procedures allocated = 709.
 Total words allocated = 22455.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Breakdown of interesting processes.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Process 311B running at priority [normal, foreground] = 8152 (83.3%).
CommandToolImpl.CommandToolBase = 8152 (83.3%).

Process 365B running at priority [background, normal] = 538 (5.4%).
CollectorImpl.BackgroundCollector = 538 (5.4%).

Process 313B running at priority [normal] = 335 (3.4%).
Watch.Watcher = 335 (3.4%).

Process 353B running at priority [foreground] = 121 (1.2%).
SpyLogImpl.WriteBuffer = 121 (1.2%).

Assorted processes = 280 (2.8%).

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Breakdown of interesting procedures.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

CommandToolImpl.CommandToolBase (1 refs) = 0, 8152 (83.3%).
! (19831) ProcessPropsImpl.PushPropList = 8152 (83.3%).
!
! ProcessPropsImpl.PushPropList (1 refs) = 0, 8152 (83.3%).
! (821) CommandToolImpl.inner = 8152 (83.3%).
!
! CommandToolImpl.inner (1 refs) = 0, 8152 (83.3%).
! (19737) ReadEvalPrintImpl.MainLoop = 8152 (83.3%).
!
! ReadEvalPrintImpl.MainLoop (1 refs) = 0, 8152 (83.3%).
! (2848) ReadEvalPrintImpl.inner = 8152 (83.3%).
!
! ReadEvalPrintImpl.inner (1 refs) = 0, 8152 (83.3%).
! (2653) ReadEvalPrintImpl.MainLoopInternal = 8152 (83.3%).
!
! ReadEvalPrintImpl.MainLoopInternal (1 refs) = 0, 8152 (83.3%).
! (4783) CommandToolImpl.EachCommand = 8152 (83.3%).
!
! CommandToolImpl.EachCommand (1 refs) = 0, 8152 (83.3%).
! (8105) CommandToolImpl.ExecuteCommand = 8152 (83.3%).
!
! CommandToolImpl.ExecuteCommand (1 refs) = 0, 8152 (83.3%).
! (12982) CommandToolImpl.Base = 8152 (83.3%).
!
! CommandToolImpl.Base (1 refs) = 0, 8152 (83.3%).
! (12462) CommandToolImpl.innerExecute = 8152 (83.3%).
!
! CommandToolImpl.innerExecute (1 refs) = 0, 8152 (83.3%).
! (11765) PrintFileConvertImpl.Command = 8152 (83.3%).
!
! PrintFileConvertImpl.Command (1 refs) = 0, 8152 (83.3%).
! (16262) PrintFileConvertImpl.InterpressToPDAction = 8152 (83.3%).
!
! PrintFileConvertImpl.InterpressToPDAction (1 refs) = 0, 8152 (83.3%).
! (10660) ImagerPDImpl.5110B = 8152 (83.3%).
!
! ImagerPDImpl.5110B (1 refs) = 0, 8152 (83.3%).
! ImagerImpl.DoSaveAll = 8152 (83.3%).
!
! ImagerImpl.DoSaveAll (1 refs) = 0, 8152 (83.3%).
! (1924) ImagerStateImpl.StateDoSave = 8047 (82.2%).
! (1924) ImagerMaskCaptureImpl.MyDoSave = 105 (1.0%).
!
! ImagerStateImpl.StateDoSave (2 refs) = 5, 8147 (83.3%).
! (2567) IPExecImpl.call = 148 (1.5%).
! (2567) IPBaseImpl.action = 7854 (80.2%).
! (2567) ImagerFontImpl.action = 105 (1.0%).
!
! IPBaseImpl.action (1 refs) = 0, 7854 (80.2%).
! . (2737) IPExecImpl.CallInlineBody = 7854 (80.2%).
! .
! IPExecImpl.CallInlineBody (2 refs) = 2, 7869 (80.4%).
! . (9959) IPContextImpl.Call = 7869 (80.4%).
! .
! IPContextImpl.Call (2 refs) = 3, 8014 (81.9%).
! . (1297) IPExecImpl.action = 8005 (81.8%).
! .
! . IPExecImpl.action (1 refs) = 2, 8003 (81.8%).
! . (9932) IPExecImpl.ExecuteInlineBody = 8003 (81.7%).
! .
! . IPExecImpl.ExecuteInlineBody (1 refs) = 2, 8001 (81.7%).
! . (9151) IPExecImpl.ExecuteToEndOfBody = 7993 (81.6%).
! .
! . IPExecImpl.ExecuteToEndOfBody (1 refs) = 194, 7799 (81.6%).
! . . (7628) IPMasterImpl.GetToken = 621 (6.3%).
! . . (8126) IPExecImpl.FinishSequence = 438 (4.4%).
! . . (8285) IPApplyImpl.Apply = 6364 (65.0%).
! . . (8410) IPExecImpl.ExtendSequence = 262 (2.6%).
! . .
! . . IPApplyImpl.Apply (1 refs) = 13, 6351 (65.0%).
! . . ! (4510) IPBaseImpl.ApplyMAKESIMPLECO = 146 (1.4%).
! . . ! (4510) IPBaseImpl.ApplyFSET = 105 (1.0%).
! . . ! (4510) IPBaseImpl.ApplyDO = 101 (1.0%).
! . . ! (4510) IPBaseImpl.ApplyMAKEVEC = 107 (1.0%).
! . . ! (4510) IPImageImpl.ApplyMASKFILL = 297 (3.0%).
! . . ! (4510) IPImageImpl.ApplyCURVETO = 176 (1.7%).
! . . ! (4510) IPImageImpl.ApplyMASKSTROKECLOSED = 652 (6.6%).
! . . ! (4510) IPImageImpl.ApplyMASKSTROKE = 4561 (46.6%).
! . . !
! . . ! IPImageImpl.ApplyMASKSTROKE (1 refs) = 0, 4561 (46.6%).
! . . ! ! (17569) IPImageImpl.MaskStroke = 4561 (46.6%).
! . . ! !
! . . ! IPImageImpl.ApplyMASKSTROKECLOSED (1 refs) = 1, 651 (6.6%).
! . . ! ! (17660) IPImageImpl.MaskStroke = 651 (6.6%).
! . . ! !
! . . ! IPImageImpl.ApplyMASKFILL (1 refs) = 1, 296 (3.0%).
! . . ! . (15851) ImagerImpl.MaskFill = 295 (3.0%).
! . . ! .
! . . ! IPImageImpl.MaskStroke (2 refs) = 3, 5209 (53.2%).
! . . ! (17379) ImagerImpl.MaskStroke = 5201 (53.1%).
! . . !
! . . ! ImagerImpl.MaskStroke (1 refs) = 2, 5199 (53.1%).
! . . ! (11395) ImagerRasterImpl.RasterMaskStroke = 5199 (53.1%).
! . . !
! . . ! ImagerRasterImpl.RasterMaskStroke (1 refs) = 2, 5197 (53.1%).
! . . ! (15692) ImagerRasterImpl.MaskRuns = 5174 (52.8%).
! . . !
! . . IPExecImpl.FinishSequence (1 refs) = 27, 411 (4.4%).
! . . (6301) IPExecImpl.DoRational = 347 (3.5%).
! . .
! . . IPExecImpl.DoRational (1 refs) = 100, 247 (3.5%).
! . .
! . IPMasterImpl.GetToken (3 refs) = 256, 480 (2.6%) (7.5%).
! . (19025) IOCommonImpl.GetIndex = 138 (1.4%).
! . (19059) IOCommonImpl.GetChar = 172 (1.7%).
! .
! . IOCommonImpl.GetChar (4 refs) = 96, 246 (3.4%).
! . (10341) FileStreamImpl.GetChar = 246 (2.5%).
! .
! ImagerImpl.MaskFill (2 refs) = 0, 400 (4.0%).
! . (9498) ImagerRasterImpl.RasterMaskFill = 295 (3.0%).
! . (9498) ImagerMaskCaptureImpl.MyMaskFill = 105 (1.0%).
! .
! . ImagerRasterImpl.RasterMaskFill (2 refs) = 0, 400 (4.0%).
! . (11999) ImagerRasterImpl.MaskRuns = 372 (3.8%).
! .
! ImagerRasterImpl.MaskRuns (2 refs) = 0, 5546 (56.6%).
! (11162) ImagerRasterImpl.RunsFromPath = 5546 (56.6%).
!
! ImagerRasterImpl.RunsFromPath (1 refs) = 5, 5541 (56.6%).
! (9611) ImagerScanConverterImpl.CreatePath = 4188 (42.8%).
! (10728) ImagerRasterImpl.maskRunsAction = 1348 (13.7%).
!
! ImagerScanConverterImpl.CreatePath (1 refs) = 20, 4168 (42.8%).
! ! (16408) ImagerPathImpl.Transform = 4119 (42.0%).
! !
! ! ImagerPathImpl.Transform (1 refs) = 7, 4112 (42.0%).
! ! (6865) IPImageImpl.path = 102 (1.0%).
! ! (6865) IPImageImpl.path = 3865 (39.5%).
! !
! ! IPImageImpl.path (1 refs) = 1, 3864 (39.5%).
! ! . (17250) IPStackImpl.DoTopPath = 3864 (39.4%).
! ! .
! ! IPStackImpl.DoTopPath (2 refs) = 60, 3906 (40.5%).
! ! . (8349) ImagerPathImpl.TransformLineTo = 158 (1.6%).
! ! . (8463) ImagerPathImpl.TransformCurveTo = 3740 (38.2%).
! ! .
! ! ImagerPathImpl.TransformCurveTo (2 refs) = 96, 3711 (38.9%).
! ! . (6090) ImagerScanConverterImpl.Curve = 1298 (13.2%).
! ! . (6175) ImagerScanConverterImpl.Curve = 107 (1.0%).
! ! . (6175) ImagerStrokeImpl.Curve = 2239 (22.8%).
! ! .
! ! . ImagerStrokeImpl.Curve (1 refs) = 114, 2125 (22.8%).
! ! . ! (8275) ImagerStrokeImpl.TraverseCubic = 817 (8.3%).
! ! . ! (8375) ImagerStrokeImpl.TraverseCubic = 791 (8.0%).
! ! . !
! ! . ! ImagerStrokeImpl.TraverseCubic (2 refs) = 273, 1335 (2.7%) (16.4%).
! ! . ! (4414) ImagerStrokeImpl.ParallelTo = 367 (3.7%).
! ! . ! (4468) ImagerStrokeImpl.ParallelTo = 331 (3.3%).
! ! . ! (4828) ImagerStrokeImpl.SubDivide = 392 (4.0%).
! ! . ! (4993) ImagerPathImpl.TransformLineTo = 152 (1.5%).
! ! . !
! ! . ! ImagerStrokeImpl.ParallelTo (2 refs) = 208, 490 (2.1%) (7.1%).
! ! . ! ! (3997) ImagerStrokeImpl.RealRoots = 325 (3.3%).
! ! . ! !
! ! . ! ! ImagerStrokeImpl.RealRoots (1 refs) = 216, 109 (2.2%) (3.3%).
! ! . ! ! (3093) RealFnsImpl.SqRt = 109 (1.1%).
! ! . ! !
! ! . ! ImagerStrokeImpl.SubDivide (1 refs) = 127, 265 (4.0%).
! ! . !
! ! . ImagerScanConverterImpl.Curve (2 refs) = 60, 1345 (14.3%).
! ! . (16014) ImagerScanConverterImpl.AppendBezier = 1345 (13.7%).
! ! .
! ! . ImagerScanConverterImpl.AppendBezier (1 refs) = 277, 1068 (2.8%) (13.7%).
! ! . (15258) ImagerScanConverterImpl.AppendMonotoneBezier = 109 (1.1%).
! ! . (15293) ImagerScanConverterImpl.AppendMonotoneBezier = 719 (7.3%).
! ! .
! ! . ImagerScanConverterImpl.AppendMonotoneBezier (6 refs) = 284, 639 (2.9%) (9.4%).
! ! . (13817) ImagerScanConverterImpl.AppendMonotoneShortPiece = 639 (6.5%).
! ! .
! ! . ImagerScanConverterImpl.AppendMonotoneShortPiece (1 refs) = 257, 382 (2.6%) (6.5%).
! ! . (9432) ImagerScanConverterImpl.IterationsUntilFlat = 250 (2.5%).
! ! . (9515) ImagerScanConverterImpl.AppendSegment = 104 (1.0%).
! ! .
! ! ImagerPathImpl.TransformLineTo (9 refs) = 42, 397 (4.4%).
! ! . (5944) ImagerScanConverterImpl.Line = 299 (3.0%).
! ! .
! ! ImagerScanConverterImpl.Line (3 refs) = 138, 256 (4.0%).
! ! . (15658) ImagerScanConverterImpl.AppendSegment = 256 (2.6%).
! ! .
! ! ImagerScanConverterImpl.AppendSegment (2 refs) = 320, 40 (3.2%) (3.6%).
! !
! ImagerRasterImpl.maskRunsAction (1 refs) = 1, 1347 (13.7%).
! (11063) ImagerPDImpl.13700B = 1332 (13.6%).
!
! ImagerPDImpl.13700B (1 refs) = 3, 1329 (13.6%).
! . PDFileWriterImpl.MaskRunGroup = 1329 (13.5%).
! .
! . PDFileWriterImpl.MaskRunGroup (1 refs) = 5, 1324 (13.5%).
! . (16273) ImagerRasterImpl.runs = 1296 (13.2%).
! .
! ImagerRasterImpl.runs (2 refs) = 4, 1305 (13.3%).
! (9976) ImagerScanConverterImpl.ConvertToRuns = 1305 (13.3%).
!
! ImagerScanConverterImpl.ConvertToRuns (1 refs) = 1, 1304 (13.3%).
! (24103) ImagerScanConverterImpl.Convert = 1304 (13.3%).
!
! ImagerScanConverterImpl.Convert (1 refs) = 384, 920 (3.9%) (13.3%).
! (22288) ImagerScanConverterImpl.FValueFor = 276 (2.8%).
! (22595) ImagerScanConverterImpl.Result = 560 (5.7%).
!
! ImagerScanConverterImpl.Result (1 refs) = 137, 423 (5.7%).
! (23626) ImagerScanConverterImpl.ShellSort = 157 (1.6%).
! (24026) PDFileWriterImpl.CaptureRun = 265 (2.7%).
!
CollectorImpl.BackgroundCollector (1 refs) = 0, 538 (5.4%).
! (4817) ZCTImpl.ScanTheFrameHeap = 199 (2.0%).
! (4849) ZCTImpl.MapReclaimableObjects = 310 (3.1%).
!
! ZCTImpl.MapReclaimableObjects (1 refs) = 17, 293 (3.1%).
! (5290) ReclaimerImpl.Reclaim = 236 (2.4%).
!
Watch.Watcher (1 refs) = 4, 331 (3.4%).
(28483) VMAllocImpl.Allocate = 116 (1.1%).


The remaining procedures had less than 291 wakeups.
APPENDIX B
DATA FOR ContourFiltered Master
Experiment: make a PD file, one separation, for the 400 spi printer.
% interpresstopd ContourFiltered.PD.color400 ← ContourFiltered.IP color400 black of 4 0.1 scale
Reading []<>Users>Pier.PA>ContourFiltered.IP!1 . . . [1] []<>Users>Pier.PA>ContourFiltered.PD.color400!1 written.
{01:44:28 seconds, 73 page faults}
one hour, 44 minutes !!
==========================================================
Cedar Spy of: December 12, 1985 10:51:34 am PST.
Executed at: December 13, 1985 4:30:31 pm PST.
Measuring CPU usage.
(Waking up on vertical retrace. (80 times a second))

(Please wait-- processing log.)

Spy ran for 6 minutes 17 seconds.
Total wakeups = 29193 (77 per second).
Total page faults = 0 (0 per second).
Total words allocated = 2574126 (6827 per second).
Total words reclaimed = 2578660 (6839 per second).

Scheduled Process-Priority Summary:
processor idle = 150 (0.5%).
priority background = 2984 (10.2%).
priority normal = 25724 (88.1%).
priority foreground = 303 (1.0%).
priority pagefaultHigh = 32 (0.1%).

Instructions (see SpyDoc.tioga for more information):
 Indentation is used to show containment.
 Periods are used to keep track of procedures at the same level of indentation.
 Exclamation points (!) are used to group together sets of disjoint procedures.
 Italics are used to indicate procedures with more than one parent.
 Bold is used to indicate procedures which actually had allocations or page faults.
 Impl.Proc = x, y (o%) (z%):
  x = counts in Impl.Proc.
  y = counts in procedures called from Impl.Proc.
  o = x/ total % (only displayed if > 1%).
  z = (x + y)/ total = % time IN THE CALL STACK.

Statistics on execution of Cedar Spy:
 Processed log in 312.658 seconds. Total samples read from log = 29193.
 Average stack depth = 45.
 No. modules allocated = 99.
 No. procedures allocated = 482.
 Total words allocated = 15022.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Breakdown of interesting processes.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Process 306B running at priority [normal] = 25092 (85.9%).
CommandToolImpl.CommandToolBase = 25092 (85.9%).

Process 365B running at priority [background, normal] = 3442 (11.7%).
CollectorImpl.BackgroundCollector = 3442 (11.7%).

Assorted processes = 509 (1.7%).

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Breakdown of interesting procedures.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

CommandToolImpl.CommandToolBase (1 refs) = 0, 25092 (85.9%).
! (19831) ProcessPropsImpl.PushPropList = 25092 (85.9%).
!
! ProcessPropsImpl.PushPropList (1 refs) = 0, 25092 (85.9%).
! (821) CommandToolImpl.inner = 25092 (85.9%).
!
! CommandToolImpl.inner (1 refs) = 0, 25092 (85.9%).
! (19737) ReadEvalPrintImpl.MainLoop = 25092 (85.9%).
!
! ReadEvalPrintImpl.MainLoop (1 refs) = 0, 25092 (85.9%).
! (2848) ReadEvalPrintImpl.inner = 25092 (85.9%).
!
! ReadEvalPrintImpl.inner (1 refs) = 0, 25092 (85.9%).
! (2653) ReadEvalPrintImpl.MainLoopInternal = 25092 (85.9%).
!
! ReadEvalPrintImpl.MainLoopInternal (1 refs) = 0, 25092 (85.9%).
! (4783) CommandToolImpl.EachCommand = 25092 (85.9%).
!
! CommandToolImpl.EachCommand (1 refs) = 0, 25092 (85.9%).
! (8105) CommandToolImpl.ExecuteCommand = 25092 (85.9%).
!
! CommandToolImpl.ExecuteCommand (1 refs) = 0, 25092 (85.9%).
! (12982) CommandToolImpl.Base = 25092 (85.9%).
!
! CommandToolImpl.Base (1 refs) = 0, 25092 (85.9%).
! (12462) CommandToolImpl.innerExecute = 25092 (85.9%).
!
! CommandToolImpl.innerExecute (1 refs) = 0, 25092 (85.9%).
! (11765) PrintFileConvertImpl.Command = 25092 (85.9%).
!
! PrintFileConvertImpl.Command (1 refs) = 0, 25092 (85.9%).
! (16262) PrintFileConvertImpl.InterpressToPDAction = 25092 (85.9%).
!
! PrintFileConvertImpl.InterpressToPDAction (1 refs) = 0, 25092 (85.9%).
! (10660) ImagerPDImpl.DoPage = 25092 (85.9%).
!
! ImagerPDImpl.DoPage (1 refs) = 0, 25092 (85.9%).
! (11827) ImagerImpl.DoSaveAll = 25092 (85.9%).
!
! ImagerImpl.DoSaveAll (1 refs) = 0, 25092 (85.9%).
! (1924) ImagerStateImpl.StateDoSave = 25092 (85.9%).
!
! ImagerStateImpl.StateDoSave (1 refs) = 0, 25092 (85.9%).
! (2567) IPExecImpl.call = 25092 (85.9%).
!
! IPExecImpl.call (1 refs) = 0, 25092 (85.9%).
! (12582) IPContextImpl.Call = 25092 (85.9%).
!
! IPContextImpl.Call (1 refs) = 0, 25092 (85.9%).
! (1297) IPExecImpl.action = 25092 (85.9%).
!
! IPExecImpl.action (1 refs) = 0, 25092 (85.9%).
! (9932) IPExecImpl.ExecuteInlineBody = 25092 (85.9%).
!
! IPExecImpl.ExecuteInlineBody (1 refs) = 0, 25092 (85.9%).
! (9151) IPExecImpl.ExecuteToEndOfBody = 25092 (85.9%).
!
! IPExecImpl.ExecuteToEndOfBody (1 refs) = 753, 24339 (2.5%) (85.9%).
! (7628) IPMasterImpl.GetToken = 2303 (7.8%).
! (8285) IPApplyImpl.Apply = 21442 (73.4%).
! (8342) IPStackImpl.PushNum = 594 (2.0%).
!
! IPApplyImpl.Apply (1 refs) = 109, 21333 (73.4%).
! ! (4510) IPImageImpl.ApplyLINETO = 1638 (5.6%).
! ! (4510) IPImageImpl.ApplyMASKSTROKE = 19399 (66.4%).
! !
! ! IPImageImpl.ApplyMASKSTROKE (1 refs) = 0, 19399 (66.4%).
! ! ! (17569) IPImageImpl.MaskStroke = 19399 (66.4%).
! ! !
! ! ! IPImageImpl.MaskStroke (1 refs) = 1, 19398 (66.4%).
! ! ! (17379) ImagerImpl.MaskStroke = 9414 (32.2%).
! ! ! (17436) ImagerImpl.MaskStrokeTrajectory = 9982 (34.1%).
! ! !
! ! ! ImagerImpl.MaskStrokeTrajectory (1 refs) = 0, 9982 (34.1%).
! ! ! ! (11749) ImagerRasterImpl.RasterMaskStroke = 9982 (34.1%).
! ! ! !
! ! ! ImagerImpl.MaskStroke (1 refs) = 0, 9414 (32.2%).
! ! ! . (11395) ImagerRasterImpl.RasterMaskStroke = 9414 (32.2%).
! ! ! .
! ! ! ImagerRasterImpl.RasterMaskStroke (2 refs) = 3, 19393 (66.4%).
! ! ! (15692) ImagerRasterImpl.MaskRuns = 19393 (66.4%).
! ! !
! ! ! ImagerRasterImpl.MaskRuns (1 refs) = 0, 19393 (66.4%).
! ! ! (11162) ImagerRasterImpl.RunsFromPath = 19393 (66.4%).
! ! !
! ! ! ImagerRasterImpl.RunsFromPath (1 refs) = 2, 19391 (66.4%).
! ! ! (9611) ImagerScanConverterImpl.CreatePath = 13839 (47.4%).
! ! ! (10728) ImagerRasterImpl.maskRunsAction = 5551 (19.0%).
! ! !
! ! ! ImagerScanConverterImpl.CreatePath (1 refs) = 5, 13834 (47.4%).
! ! ! ! (16408) ImagerPathImpl.Transform = 13725 (47.0%).
! ! ! !
! ! ! ImagerRasterImpl.maskRunsAction (1 refs) = 1, 5550 (19.0%).
! ! ! (11063) ImagerPDImpl.MaskRuns = 5550 (19.0%).
! ! !
! ! ! ImagerPDImpl.MaskRuns (1 refs) = 2, 5548 (19.0%).
! ! ! (26936) PDFileWriterImpl.MaskRunGroup = 5548 (19.0%).
! ! !
! ! ! PDFileWriterImpl.MaskRunGroup (1 refs) = 0, 5548 (19.0%).
! ! ! (16273) ImagerRasterImpl.runs = 5533 (18.9%).
! ! !
! ! ! ImagerRasterImpl.runs (1 refs) = 1, 5532 (18.9%).
! ! ! (9976) ImagerScanConverterImpl.ConvertToRuns = 5532 (18.9%).
! ! !
! ! ! ImagerScanConverterImpl.ConvertToRuns (1 refs) = 1, 5531 (18.9%).
! ! ! (24103) ImagerScanConverterImpl.Convert = 5531 (18.9%).
! ! !
! ! ! ImagerScanConverterImpl.Convert (1 refs) = 3751, 1780 (12.8%) (18.9%).
! ! ! (19995) ImagerScanConverterImpl.InitialBucketTable = 495 (1.6%).
! ! ! (22595) ImagerScanConverterImpl.Result = 1154 (3.9%).
! ! !
! ! ! ImagerScanConverterImpl.Result (1 refs) = 230, 924 (3.9%).
! ! ! (23626) ImagerScanConverterImpl.ShellSort = 567 (1.9%).
! ! ! (24026) PDFileWriterImpl.CaptureRun = 357 (1.2%).
! ! !
! ! IPImageImpl.ApplyLINETO (1 refs) = 238, 1400 (5.6%).
! ! . (14021) IPImageImpl.PopVec = 409 (1.4%).
! ! . (14044) IPStackImpl.ExtendTrajectory = 385 (1.3%).
! ! .
! ! ImagerPathImpl.Transform (2 refs) = 2, 14003 (47.9%).
! ! (6865) ImagerImpl.path = 7029 (24.0%).
! ! (6865) IPImageImpl.path = 6645 (22.7%).
! !
! ! ImagerImpl.path (1 refs) = 0, 7029 (24.0%).
! ! ! (11614) ImagerPathImpl.MapTrajectory = 7029 (24.0%).
! ! !
! ! ! ImagerPathImpl.MapTrajectory (1 refs) = 0, 7029 (24.0%).
! ! ! (9128) ImagerPathImpl.Map = 7029 (24.0%).
! ! !
! ! ! ImagerPathImpl.Map (1 refs) = 208, 6821 (24.0%).
! ! ! (8902) ImagerPathImpl.TransformLineTo = 6808 (23.3%).
! ! !
! ! IPImageImpl.path (1 refs) = 1, 6644 (22.7%).
! ! . (17250) IPStackImpl.DoTopPath = 6644 (22.7%).
! ! .
! ! IPStackImpl.DoTopPath (2 refs) = 189, 6735 (23.7%).
! ! . (8349) ImagerPathImpl.TransformLineTo = 6732 (23.0%).
! ! .
! ! ImagerPathImpl.TransformLineTo (3 refs) = 782, 12771 (2.6%) (46.4%).
! ! . (5944) ImagerScanConverterImpl.Line = 5148 (17.6%).
! ! . (5960) ImagerTransformationImpl.Transform = 406 (1.3%).
! ! . (5985) ImagerStrokeImpl.Line = 7026 (24.0%).
! ! .
! ! . ImagerStrokeImpl.Line (1 refs) = 1495, 5531 (5.1%) (24.0%).
! ! . (6572) ImagerStrokeImpl.FindVertex = 1259 (4.3%).
! ! . (6633) ImagerStrokeImpl.FindVertex = 1255 (4.2%).
! ! . (6808) ImagerPathImpl.TransformMoveTo = 867 (2.9%).
! ! . (6885) ImagerPathImpl.TransformMoveTo = 1123 (3.8%).
! ! .
! ! . ImagerStrokeImpl.FindVertex (2 refs) = 1232, 1282 (4.2%) (8.6%).
! ! . (1735) Vector2Impl.Dot = 492 (1.6%).
! ! . (1831) Vector2Impl.Dot = 449 (1.5%).
! ! .
! ! . Vector2Impl.Dot (2 refs) = 941 (3.2%).
! ! .
! ! ImagerPathImpl.TransformMoveTo (4 refs) = 239, 1762 (6.8%).
! ! . (5796) ImagerScanConverterImpl.Close = 1650 (5.6%).
! ! .
! ! ImagerScanConverterImpl.Close (2 refs) = 131, 1527 (5.6%).
! ! . (16090) ImagerScanConverterImpl.Line = 1391 (4.7%).
! ! .
! ! ImagerScanConverterImpl.Line (2 refs) = 2025, 4514 (6.9%) (22.3%).
! ! (15658) ImagerScanConverterImpl.AppendSegment = 4514 (15.4%).
! !
! ! ImagerScanConverterImpl.AppendSegment (1 refs) = 3884, 630 (13.3%) (15.4%).
! ! (9141) AllocatorImpl.NewSystemObject = 630 (2.1%).
! !
! IPMasterImpl.GetToken (1 refs) = 807, 1496 (2.7%) (7.8%).
! (19025) IOCommonImpl.GetIndex = 521 (1.7%).
! (19059) IOCommonImpl.GetChar = 590 (2.0%).
! (19113) IOCommonImpl.GetChar = 385 (1.3%).
!
! IOCommonImpl.GetChar (2 refs) = 266, 709 (3.3%).
! (10341) FileStreamImpl.GetChar = 709 (2.4%).
!
CollectorImpl.BackgroundCollector (1 refs) = 0, 3442 (11.7%).
. (4817) ZCTImpl.ScanTheFrameHeap = 1097 (3.7%).
. (4849) ZCTImpl.MapReclaimableObjects = 2083 (7.1%).
.
. ZCTImpl.MapReclaimableObjects (1 refs) = 278, 1805 (7.1%).
. ! (5290) ReclaimerImpl.Reclaim = 1194 (4.0%).
. ! (5474) ZCTImpl.PullNextEntry = 526 (1.8%).
. !
. ! ReclaimerImpl.Reclaim (1 refs) = 545, 649 (4.0%).
. ! (2617) AllocatorImpl.FreeObject = 649 (2.2%).
. !
. ZCTImpl.ScanTheFrameHeap (1 refs) = 1, 1096 (3.7%).
. (4440) RTFrameHeapSnapshotImpl.MapUncountedBodies = 916 (3.1%).
.
. RTFrameHeapSnapshotImpl.MapUncountedBodies (1 refs) = 41, 875 (3.1%).
. (1207) ZCTImpl.ConservativeScanner = 875 (2.9%).
.
. ZCTImpl.ConservativeScanner (1 refs) = 715, 160 (2.4%) (2.9%).
.
AllocatorImpl.NewSystemObject (9 refs) = 654, 359 (2.2%) (3.4%).
(9534) StorageAccountingImpl.ConsiderCollection = 357 (1.2%).


The remaining procedures had less than 873 wakeups.
APPENDIX B
DATA FOR Random Map Master
Experiment: make a PD file and Spy snapshot
← ImagerPDImpl.ucr ← [blackGamma: 1, blackThreshold: 0, removedFraction: 0]
% InterpressToPD RandomMap.pd.color400 ← RandomMap-400.ip color400 6 ppd 0 in 1.5 in translate 1.5 scale
Reading []<>DIPPSY>RandomMap-400.ip!1 . . . [1 -- Aborted
==========================================================
Cedar Spy of: December 12, 1985 10:51:34 am PST.
Executed at: December 17, 1985 12:48:50 pm PST.
Measuring CPU usage.
(Waking up on vertical retrace. (80 times a second))

(Please wait-- processing log.)

Spy ran for 0 minutes 57 seconds.
Total wakeups = 4393 (77 per second).
Total page faults = 1 (0 per second).
Total words allocated = 73857 (1295 per second).
Total words reclaimed = 39976 (701 per second).

Scheduled Process-Priority Summary:
processor idle = 148 (3.3%).
priority background = 41 (0.9%).
priority normal = 4126 (93.9%).
priority foreground = 71 (1.6%).
priority pagefaultHigh = 7 (0.1%).

Instructions (see SpyDoc.tioga for more information):
 Indentation is used to show containment.
 Periods are used to keep track of procedures at the same level of indentation.
 Exclamation points (!) are used to group together sets of disjoint procedures.
 Italics are used to indicate procedures with more than one parent.
 Bold is used to indicate procedures which actually had allocations or page faults.
 Impl.Proc = x, y (o%) (z%):
  x = counts in Impl.Proc.
  y = counts in procedures called from Impl.Proc.
  o = x/ total % (only displayed if > 1%).
  z = (x + y)/ total = % time IN THE CALL STACK.

Statistics on execution of Cedar Spy:
 Processed log in 68.209 seconds. Total samples read from log = 4393.
 Average stack depth = 63.
 No. modules allocated = 78.
 No. procedures allocated = 339.
 Total words allocated = 10601.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Breakdown of interesting processes.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Process 311B running at priority [normal] = 4064 (92.5%).
CommandToolImpl.CommandToolBase = 4064 (92.5%).

Process 365B running at priority [background, normal] = 74 (1.6%).
CollectorImpl.BackgroundCollector = 74 (1.6%).

Assorted processes = 107 (2.4%).

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Breakdown of interesting procedures.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

CommandToolImpl.CommandToolBase (1 refs) = 0, 4064 (92.5%).
(19831) ProcessPropsImpl.PushPropList = 4064 (92.5%).

ProcessPropsImpl.PushPropList (1 refs) = 0, 4064 (92.5%).
(821) CommandToolImpl.inner = 4064 (92.5%).

CommandToolImpl.inner (1 refs) = 0, 4064 (92.5%).
(19737) ReadEvalPrintImpl.MainLoop = 4064 (92.5%).

ReadEvalPrintImpl.MainLoop (1 refs) = 0, 4064 (92.5%).
(2848) ReadEvalPrintImpl.inner = 4064 (92.5%).

ReadEvalPrintImpl.inner (1 refs) = 0, 4064 (92.5%).
(2653) ReadEvalPrintImpl.MainLoopInternal = 4064 (92.5%).

ReadEvalPrintImpl.MainLoopInternal (1 refs) = 0, 4064 (92.5%).
(4783) CommandToolImpl.EachCommand = 4064 (92.5%).

CommandToolImpl.EachCommand (1 refs) = 0, 4064 (92.5%).
(8105) CommandToolImpl.ExecuteCommand = 4064 (92.5%).

CommandToolImpl.ExecuteCommand (1 refs) = 0, 4064 (92.5%).
(12982) CommandToolImpl.Base = 4064 (92.5%).

CommandToolImpl.Base (1 refs) = 0, 4064 (92.5%).
(12462) CommandToolImpl.innerExecute = 4064 (92.5%).

CommandToolImpl.innerExecute (1 refs) = 0, 4064 (92.5%).
(11765) PrintFileConvertImpl.Command = 4064 (92.5%).

PrintFileConvertImpl.Command (1 refs) = 0, 4064 (92.5%).
(16262) PrintFileConvertImpl.InterpressToPDAction = 4064 (92.5%).

PrintFileConvertImpl.InterpressToPDAction (1 refs) = 0, 4064 (92.5%).
(10660) ImagerPDImpl.DoPage = 4064 (92.5%).

ImagerPDImpl.DoPage (1 refs) = 0, 4064 (92.5%).
(11827) ImagerImpl.DoSaveAll = 4064 (92.5%).

ImagerImpl.DoSaveAll (1 refs) = 0, 4064 (92.5%).
(1924) ImagerStateImpl.StateDoSave = 4064 (92.5%).

ImagerStateImpl.StateDoSave (1 refs) = 0, 4064 (92.5%).
(2567) IPExecImpl.call = 127 (2.8%).
(2567) IPBaseImpl.action = 3937 (89.6%).

IPBaseImpl.action (1 refs) = 0, 3937 (89.6%).
. (2571) IPExecImpl.Do = 3937 (89.6%).
.
. IPExecImpl.Do (1 refs) = 0, 3937 (89.6%).
. (10713) IPExecImpl.ComposedDo = 3937 (89.6%).
.
. IPExecImpl.ComposedDo (1 refs) = 0, 3937 (89.6%).
. (11090) IPExecImpl.CallBody = 3937 (89.6%).
.
. IPExecImpl.CallBody (1 refs) = 0, 3937 (89.6%).
. (10188) IPExecImpl.CallInlineBody = 3937 (89.6%).
.
. IPExecImpl.CallInlineBody (1 refs) = 0, 3937 (89.6%).
. (9959) IPContextImpl.Call = 3937 (89.6%).
.
IPContextImpl.Call (2 refs) = 0, 4064 (92.5%).
(1297) IPExecImpl.action = 4064 (92.5%).

IPExecImpl.action (1 refs) = 0, 4064 (92.5%).
(9932) IPExecImpl.ExecuteInlineBody = 4064 (92.5%).

IPExecImpl.ExecuteInlineBody (1 refs) = 0, 4064 (92.5%).
(9151) IPExecImpl.ExecuteToEndOfBody = 4064 (92.5%).

IPExecImpl.ExecuteToEndOfBody (1 refs) = 10, 4054 (92.5%).
(7628) IPMasterImpl.GetToken = 45 (1.0%).
(8285) IPApplyImpl.Apply = 3999 (91.0%).

IPApplyImpl.Apply (1 refs) = 0, 3999 (91.0%).
. (4510) IPImageImpl.ApplyMASKRECTANGLE = 2444 (55.6%).
. (4510) IPBaseImpl.ApplyMAKESIMPLECO = 256 (5.8%).
. (4510) IPImageImpl.ApplyMASKSTROKECLOSED = 1277 (29.0%).
.
. IPImageImpl.ApplyMASKRECTANGLE (1 refs) = 0, 2444 (55.6%).
. ! (16133) ImagerImpl.MaskRectangle = 2444 (55.6%).
. !
. ! ImagerImpl.MaskRectangle (1 refs) = 0, 2444 (55.6%).
. ! (10332) ImagerRasterImpl.RasterMaskRectangle = 2444 (55.6%).
. !
. ! ImagerRasterImpl.RasterMaskRectangle (1 refs) = 0, 2444 (55.6%).
. ! (13259) ImagerPDImpl.MaskBoxes = 2444 (55.6%).
. !
. ! ImagerPDImpl.MaskBoxes (1 refs) = 0, 2444 (55.6%).
. ! (33527) ImagerRasterImpl.boxes = 2444 (55.6%).
. !
. ! ImagerRasterImpl.boxes (1 refs) = 0, 2444 (55.6%).
. ! (13188) ImagerRasterImpl.ClipBoxToMask = 2444 (55.6%).
. !
. ! ImagerRasterImpl.ClipBoxToMask (1 refs) = 0, 2444 (55.6%).
. ! (11587) ImagerPDImpl.hardBox = 2444 (55.6%).
. !
. ! ImagerPDImpl.hardBox (1 refs) = 0, 2444 (55.6%).
. ! (33473) ImagerPDImpl.MaskRuns = 2444 (55.6%).
. !
. IPImageImpl.ApplyMASKSTROKECLOSED (1 refs) = 0, 1277 (29.0%).
. ! (17660) IPImageImpl.MaskStroke = 1277 (29.0%).
. !
. ! IPImageImpl.MaskStroke (1 refs) = 0, 1277 (29.0%).
. ! (17379) ImagerImpl.MaskStroke = 1276 (29.0%).
. !
. ! ImagerImpl.MaskStroke (1 refs) = 0, 1276 (29.0%).
. ! (11395) ImagerRasterImpl.RasterMaskStroke = 1276 (29.0%).
. !
. ! ImagerRasterImpl.RasterMaskStroke (1 refs) = 0, 1276 (29.0%).
. ! (15692) ImagerRasterImpl.MaskRuns = 1273 (28.9%).
. !
. ! ImagerRasterImpl.MaskRuns (1 refs) = 0, 1273 (28.9%).
. ! (11162) ImagerRasterImpl.RunsFromPath = 1273 (28.9%).
. !
. ! ImagerRasterImpl.RunsFromPath (1 refs) = 0, 1273 (28.9%).
. ! (9611) ImagerScanConverterImpl.CreatePath = 286 (6.5%).
. ! (10728) ImagerRasterImpl.maskRunsAction = 986 (22.4%).
. !
. ! ImagerRasterImpl.maskRunsAction (1 refs) = 0, 986 (22.4%).
. ! ! (11063) ImagerPDImpl.MaskRuns = 986 (22.4%).
. ! !
. ! ImagerScanConverterImpl.CreatePath (1 refs) = 0, 286 (6.5%).
. ! (16408) ImagerPathImpl.Transform = 284 (6.4%).
. !
. ! ImagerPathImpl.Transform (1 refs) = 1, 283 (6.4%).
. ! (6865) IPImageImpl.path = 276 (6.2%).
. !
. ! IPImageImpl.path (1 refs) = 0, 276 (6.2%).
. ! . (17250) IPStackImpl.DoTopPath = 276 (6.2%).
. ! .
. ! . IPStackImpl.DoTopPath (1 refs) = 5, 271 (6.2%).
. ! . (8349) ImagerPathImpl.TransformLineTo = 271 (6.1%).
. ! .
. ! . ImagerPathImpl.TransformLineTo (2 refs) = 8, 264 (6.1%).
. ! . (5944) ImagerScanConverterImpl.Line = 128 (2.9%).
. ! . (5985) ImagerStrokeImpl.Line = 129 (2.9%).
. ! .
. ! ImagerStrokeImpl.Line (2 refs) = 19, 113 (3.0%).
. ! . (6633) ImagerStrokeImpl.FindVertex = 45 (1.0%).
. ! .
. ! ImagerScanConverterImpl.Line (2 refs) = 39, 118 (3.5%).
. ! (15658) ImagerScanConverterImpl.AppendSegment = 118 (2.6%).
. !
. IPBaseImpl.ApplyMAKESIMPLECO (1 refs) = 0, 256 (5.8%).
. . (2148) IPExecImpl.GetInlineBody = 256 (5.8%).
. .
. . IPExecImpl.GetInlineBody (1 refs) = 0, 256 (5.8%).
. . (8952) IPMasterImpl.SkipToEndOfBody = 256 (5.8%).
. .
. . IPMasterImpl.SkipToEndOfBody (1 refs) = 26, 230 (5.8%).
. . (21077) IPMasterImpl.GetToken = 229 (5.2%).
. .
. ImagerPDImpl.MaskRuns (2 refs) = 0, 3430 (78.0%).
. (26936) PDFileWriterImpl.MaskRunGroup = 986 (22.4%).
. (29600) ImagerPDImpl.runs = 2444 (55.6%).
.
. ImagerPDImpl.runs (1 refs) = 0, 2444 (55.6%).
. ! (33427) ImagerMaskImpl.RunsFromBox = 2444 (55.6%).
. !
. ! ImagerMaskImpl.RunsFromBox (1 refs) = 0, 2444 (55.6%).
. ! (3106) ImagerPDImpl.pdSampledRun = 2444 (55.6%).
. !
. ! ImagerPDImpl.pdSampledRun (1 refs) = 3, 2441 (55.6%).
. ! (27844) ImagerSampleImpl.GetPointSamples = 1530 (34.8%).
. ! (27940) ImagerPDImpl.GetBrickSamples = 61 (1.3%).
. ! (28062) ImagerSampleImpl.SubSamples = 527 (11.9%).
. ! (28296) ImagerSampleImpl.UnsafePutFSign = 260 (5.9%).
. ! (28296) PDFileWriterImpl.ColorSamples = 60 (1.3%).
. !
. ! ImagerSampleImpl.GetPointSamples (1 refs) = 1528, 2 (34.7%) (34.8%).
. ! !
. ! ImagerSampleImpl.SubSamples (1 refs) = 2, 525 (11.9%).
. ! ! (4332) ImagerSampleImpl.UnsafeSub = 521 (11.8%).
. ! !
. ! ! ImagerSampleImpl.UnsafeSub (1 refs) = 521 (11.8%).
. ! !
. ! ImagerSampleImpl.UnsafePutFSign (1 refs) = 260 (5.9%).
. !
. PDFileWriterImpl.MaskRunGroup (1 refs) = 0, 986 (22.4%).
. (16273) ImagerRasterImpl.runs = 986 (22.4%).
.
. ImagerRasterImpl.runs (1 refs) = 0, 986 (22.4%).
. (9976) ImagerScanConverterImpl.ConvertToRuns = 986 (22.4%).
.
. ImagerScanConverterImpl.ConvertToRuns (1 refs) = 0, 986 (22.4%).
. (24103) ImagerScanConverterImpl.Convert = 986 (22.4%).
.
. ImagerScanConverterImpl.Convert (1 refs) = 276, 710 (6.2%) (22.4%).
. (19995) ImagerScanConverterImpl.InitialBucketTable = 50 (1.1%).
. (22595) ImagerScanConverterImpl.Result = 633 (14.4%).
.
. ImagerScanConverterImpl.Result (1 refs) = 151, 482 (3.4%) (14.4%).
. (23626) ImagerScanConverterImpl.ShellSort = 199 (4.5%).
. (24026) PDFileWriterImpl.CaptureRun = 283 (6.4%).
.
. PDFileWriterImpl.CaptureRun (1 refs) = 133, 150 (3.0%) (6.4%).
. ! (15461) PDFileWriterImpl.ExtendBB = 69 (1.5%).
. ! (15461) PDFileWriterImpl.ExtendBB = 54 (1.2%).
. !
. ImagerScanConverterImpl.ShellSort (1 refs) = 199 (4.5%).
.
IPMasterImpl.GetToken (2 refs) = 87, 187 (6.2%).
(19025) IOCommonImpl.GetIndex = 61 (1.3%).
(19059) IOCommonImpl.GetChar = 75 (1.7%).
(19113) IOCommonImpl.GetChar = 50 (1.1%).


The remaining procedures had less than 129 wakeups.
APPENDIX C
Floating Point Microcode Test
Test for floating point microcode
% -- Running with normal FP microcode, all other viewers except Spy destroyed, Spy watching all CPU activity
%
run spy; spy; statistics on; date; interpresstopd; -- start spy
% interpresstopd GreendaleOriginal.PD.Color400 ← GreendaleOriginal.IP color400
Monday, December 16, 1985 11:13 am PST
% interpresstopd GreendaleOriginal.PD.Color400 ← GreendaleOriginal.IP color400
Reading []<>DIPPSY>GreendaleOriginal.IP!1 . . . [1] []<>DIPPSY>GreendaleOriginal.PD.Color400!4 written.
{00:05:08 seconds, 769045 words, 555 page faults}
==========================================================
Cedar Spy of: December 12, 1985 10:51:34 am PST.
Executed at: December 16, 1985 11:18:52 am PST.
Measuring CPU usage.
(Waking up on vertical retrace. (80 times a second))

(Please wait-- processing log.)

Spy ran for 5 minutes 19 seconds.
Total wakeups = 24762 (77 per second).
Total page faults = 555 (1 per second).
Total words allocated = 769641 (2412 per second).
Total words reclaimed = 657442 (2060 per second).

Scheduled Process-Priority Summary:
processor idle = 9462 (38.2%).
priority background = 870 (3.5%).
priority normal = 14050 (56.7%).
priority foreground = 314 (1.2%).
priority pagefaultLow = 1 (0.1%).
priority pagefaultHigh = 65 (0.2%).

Instructions (see SpyDoc.tioga for more information):
 Indentation is used to show containment.
 Periods are used to keep track of procedures at the same level of indentation.
 Exclamation points (!) are used to group together sets of disjoint procedures.
 Italics are used to indicate procedures with more than one parent.
 Bold is used to indicate procedures which actually had allocations or page faults.
 Impl.Proc = x, y (o%) (z%):
  x = counts in Impl.Proc.
  y = counts in procedures called from Impl.Proc.
  o = x/ total % (only displayed if > 1%).
  z = (x + y)/ total = % time IN THE CALL STACK.

Statistics on execution of Cedar Spy:
 Processed log in 202.81 seconds. Total samples read from log = 24762.
 Average stack depth = 33.
 No. modules allocated = 132.
 No. procedures allocated = 672.
 Total words allocated = 21474.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Breakdown of interesting processes.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Process 311B running at priority [normal, foreground] = 13809 (55.7%).
CommandToolImpl.CommandToolBase = 13809 (55.7%).

Process 365B running at priority [background, normal] = 1018 (4.1%).
CollectorImpl.BackgroundCollector = 1018 (4.1%).

Assorted processes = 473 (1.9%).

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Breakdown of interesting procedures.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

CommandToolImpl.CommandToolBase (1 refs) = 0, 13809 (55.7%).
! (19831) ProcessPropsImpl.PushPropList = 13809 (55.7%).
!
! ProcessPropsImpl.PushPropList (1 refs) = 0, 13809 (55.7%).
! (821) CommandToolImpl.inner = 13809 (55.7%).
!
! CommandToolImpl.inner (1 refs) = 0, 13809 (55.7%).
! (19737) ReadEvalPrintImpl.MainLoop = 13809 (55.7%).
!
! ReadEvalPrintImpl.MainLoop (1 refs) = 0, 13809 (55.7%).
! (2848) ReadEvalPrintImpl.inner = 13809 (55.7%).
!
! ReadEvalPrintImpl.inner (1 refs) = 0, 13809 (55.7%).
! (2653) ReadEvalPrintImpl.MainLoopInternal = 13809 (55.7%).
!
! ReadEvalPrintImpl.MainLoopInternal (1 refs) = 0, 13809 (55.7%).
! (4783) CommandToolImpl.EachCommand = 13808 (55.7%).
!
! CommandToolImpl.EachCommand (1 refs) = 1, 13807 (55.7%).
! (8105) CommandToolImpl.ExecuteCommand = 13806 (55.7%).
!
! CommandToolImpl.ExecuteCommand (1 refs) = 0, 13806 (55.7%).
! (12982) CommandToolImpl.Base = 13806 (55.7%).
!
! CommandToolImpl.Base (1 refs) = 0, 13806 (55.7%).
! (12462) CommandToolImpl.innerExecute = 13806 (55.7%).
!
! CommandToolImpl.innerExecute (1 refs) = 0, 13806 (55.7%).
! (11765) PrintFileConvertImpl.Command = 13806 (55.7%).
!
! PrintFileConvertImpl.Command (1 refs) = 0, 13806 (55.7%).
! (17220) PrintFileConvertImpl.InterpressToPDAction = 13804 (55.7%).
!
! PrintFileConvertImpl.InterpressToPDAction (1 refs) = 0, 13804 (55.7%).
! (11618) ImagerPDImpl.DoPage = 13628 (55.0%).
!
! ImagerPDImpl.DoPage (1 refs) = 0, 13628 (55.0%).
! (11827) ImagerImpl.DoSaveAll = 13044 (52.6%).
! (11976) PDFileWriterImpl.EndPage = 584 (2.3%).
!
CollectorImpl.BackgroundCollector (1 refs) = 0, 1018 (4.1%).
. (4817) ZCTImpl.ScanTheFrameHeap = 358 (1.4%).
. (4849) ZCTImpl.MapReclaimableObjects = 577 (2.3%).
.
ImagerImpl.DoSaveAll (2 refs) = 0, 13059 (52.7%).
(1953) ImagerStateImpl.StateDoSave = 12935 (52.2%).

ImagerStateImpl.StateDoSave (2 refs) = 2, 13057 (52.7%).
(2736) IPBaseImpl.action = 12866 (51.9%).

IPBaseImpl.action (1 refs) = 1, 12865 (51.9%).
. (4874) IPExecImpl.CallInlineBody = 12865 (51.9%).
.
. IPExecImpl.CallInlineBody (1 refs) = 1, 12864 (51.9%).
. (10232) IPContextImpl.Call = 12864 (51.9%).
.
IPContextImpl.Call (2 refs) = 6, 12877 (52.0%).
. (684) IPExecImpl.action = 12869 (51.9%).
.
. IPExecImpl.action (1 refs) = 1, 12868 (51.9%).
. (10205) IPExecImpl.ExecuteInlineBody = 12868 (51.9%).
.
. IPExecImpl.ExecuteInlineBody (1 refs) = 0, 12868 (51.9%).
. (9412) IPExecImpl.ExecuteToEndOfBody = 12861 (51.9%).
.
. IPExecImpl.ExecuteToEndOfBody (1 refs) = 150, 12711 (51.9%).
. (7989) IPMasterImpl.GetToken = 464 (1.8%).
. (8513) IPExecImpl.FinishSequence = 404 (1.6%).
. (8573) IPApplyImpl.Apply = 11579 (46.7%).
.
. IPApplyImpl.Apply (1 refs) = 9, 11570 (46.7%).
. (5228) IPImageImpl.ApplyMASKFILL = 644 (2.6%).
. (5228) IPImageImpl.ApplyMASKSTROKECLOSED = 914 (3.6%).
. (5228) IPImageImpl.ApplyMASKSTROKE = 9378 (37.8%).
.
. IPImageImpl.ApplyMASKSTROKE (1 refs) = 2, 9376 (37.8%).
. ! (14245) ImagerImpl.MaskStrokeTrajectory = 9375 (37.8%).
. !
. IPImageImpl.ApplyMASKSTROKECLOSED (1 refs) = 0, 914 (3.6%).
. . (14402) ImagerImpl.MaskStrokeTrajectory = 914 (3.6%).
. .
. ImagerImpl.MaskStrokeTrajectory (2 refs) = 0, 10289 (41.5%).
. (11603) ImagerRasterImpl.RasterMaskStroke = 10289 (41.5%).
.
. ImagerRasterImpl.RasterMaskStroke (1 refs) = 1, 10288 (41.5%).
. (15544) ImagerRasterImpl.MaskRuns = 10244 (41.3%).
.
ImagerRasterImpl.RasterMaskFill (2 refs) = 0, 768 (3.1%).
. (11861) ImagerRasterImpl.MaskRuns = 749 (3.0%).
.
ImagerRasterImpl.MaskRuns (2 refs) = 1, 10992 (44.3%).
(11027) ImagerRasterImpl.RunsFromPath = 10992 (44.3%).

ImagerRasterImpl.RunsFromPath (1 refs) = 2, 10990 (44.3%).
(9473) ImagerScanConverterImpl.CreatePath = 4125 (16.6%).
(10594) ImagerRasterImpl.maskRunsAction = 6862 (27.7%).

ImagerRasterImpl.maskRunsAction (1 refs) = 1, 6861 (27.7%).
! (10928) ImagerPDImpl.MaskRuns = 6817 (27.5%).
!
! ImagerPDImpl.MaskRuns (1 refs) = 3, 6814 (27.5%).
! . (26936) PDFileWriterImpl.MaskRunGroup = 6814 (27.5%).
! .
! . PDFileWriterImpl.MaskRunGroup (1 refs) = 3, 6811 (27.5%).
! . (16273) ImagerRasterImpl.runs = 6790 (27.4%).
! .
! ImagerRasterImpl.runs (2 refs) = 1, 6818 (27.5%).
! (9838) ImagerScanConverterImpl.ConvertToRuns = 6818 (27.5%).
!
! ImagerScanConverterImpl.ConvertToRuns (1 refs) = 1, 6817 (27.5%).
! (24252) ImagerScanConverterImpl.Convert = 6817 (27.5%).
!
! ImagerScanConverterImpl.Convert (1 refs) = 1052, 5765 (4.2%) (27.5%).
! (20138) ImagerScanConverterImpl.InitialBucketTable = 278 (1.1%).
! (22431) ImagerScanConverterImpl.FValueFor = 2385 (9.6%).
! (22738) ImagerScanConverterImpl.Result = 3041 (12.2%).
!
! ImagerScanConverterImpl.Result (1 refs) = 847, 2194 (3.4%) (12.2%).
! ! (23775) ImagerScanConverterImpl.ShellSort = 703 (2.8%).
! ! (24175) PDFileWriterImpl.CaptureRun = 1486 (6.0%).
! !
! ! PDFileWriterImpl.CaptureRun (1 refs) = 633, 853 (2.5%) (6.0%).
! ! (15461) PDFileWriterImpl.ExtendBB = 328 (1.3%).
! ! (15461) PDFileWriterImpl.ExtendBB = 310 (1.2%).
! !
! ImagerScanConverterImpl.FValueFor (1 refs) = 2385 (9.6%).
!
ImagerScanConverterImpl.CreatePath (1 refs) = 18, 4107 (16.6%).
(16551) ImagerPathImpl.Transform = 4063 (16.4%).

ImagerPathImpl.Transform (1 refs) = 3, 4060 (16.4%).
(6865) ImagerImpl.path = 3847 (15.5%).

ImagerImpl.path (1 refs) = 0, 3847 (15.5%).
. (11468) ImagerPathImpl.MapTrajectory = 3847 (15.5%).
.
ImagerPathImpl.MapTrajectory (2 refs) = 2, 3923 (15.8%).
. (9128) ImagerPathImpl.Map = 3923 (15.8%).
.
. ImagerPathImpl.Map (1 refs) = 36, 3887 (15.8%).
. (8947) ImagerPathImpl.TransformCurveTo = 3773 (15.2%).
.
ImagerPathImpl.TransformCurveTo (2 refs) = 71, 3757 (15.4%).
(6090) ImagerScanConverterImpl.Curve = 1326 (5.3%).
(6175) ImagerStrokeImpl.Curve = 2294 (9.2%).

ImagerStrokeImpl.Curve (1 refs) = 86, 2208 (9.2%).
! (8275) ImagerStrokeImpl.TraverseCubic = 856 (3.4%).
! (8375) ImagerStrokeImpl.TraverseCubic = 908 (3.6%).
!
! ImagerStrokeImpl.TraverseCubic (2 refs) = 280, 1484 (7.1%).
! (4414) ImagerStrokeImpl.ParallelTo = 346 (1.3%).
! (4468) ImagerStrokeImpl.ParallelTo = 364 (1.4%).
! (4828) ImagerStrokeImpl.SubDivide = 426 (1.7%).
!
ImagerScanConverterImpl.Curve (2 refs) = 51, 1364 (5.7%).
(16157) ImagerScanConverterImpl.AppendBezier = 1364 (5.5%).

ImagerScanConverterImpl.AppendBezier (1 refs) = 258, 1106 (5.5%).
(15436) ImagerScanConverterImpl.AppendMonotoneBezier = 802 (3.2%).

ImagerScanConverterImpl.AppendMonotoneBezier (5 refs) = 278, 704 (3.9%).
(13960) ImagerScanConverterImpl.AppendMonotoneShortPiece = 703 (2.8%).


The remaining procedures had less than 741 wakeups.
Now repeat test without FP microcode
% -- Running with NO FP microcode, all other viewers except Spy destroyed, Spy watching all CPU activity
% run spy; spy; statistics on; date; interpresstopd; -- start spy
% Monday, December 16, 1985 11:30 am PST
% interpresstopd GreendaleOriginal.PD.Color400 ← GreendaleOriginal.IP color400
Reading []<>DIPPSY>GreendaleOriginal.IP!1 . . . [1] []<>DIPPSY>GreendaleOriginal.PD.Color400!5 written.
{00:42:34 seconds, 782031 words, 555 page faults}
APPENDIX D
RandomMap Test with storage collection defeated
Test after raising a scratch buffer count to a very high level
% ← ImagerScanConverterImpl.retainScratch ← 100000
{0.40 seconds, 634 words}
% InterpressToPD RandomMap.pd.color400 ← RandomMap-400.ip color400 6 ppd 0 in 1.5 in translate 1.5 scale
Reading []<>DIPPSY>RandomMap-400.ip!1 . . . [1] []<>DIPPSY>RandomMap.pd.color400!1 written.
{00:18:11 seconds, 658599 words, 950 page faults}
==========================================================
Cedar Spy of: December 12, 1985 10:51:34 am PST.
Executed at: December 17, 1985 6:14:16 pm PST.
Measuring CPU usage.
(Waking up on vertical retrace. (80 times a second))

(Please wait-- processing log.)

Spy ran for 1 minutes 14 seconds.
Total wakeups = 5250 (70 per second).
Total page faults = 2 (0 per second).
Total words allocated = 53521 (723 per second).
Total words reclaimed = 17038 (230 per second).

Scheduled Process-Priority Summary:
processor idle = 241 (4.5%).
priority background = 11 (0.2%).
priority normal = 4881 (92.9%).
priority foreground = 107 (2.0%).
priority pagefaultHigh = 10 (0.1%).

Instructions (see SpyDoc.tioga for more information):
 Indentation is used to show containment.
 Periods are used to keep track of procedures at the same level of indentation.
 Exclamation points (!) are used to group together sets of disjoint procedures.
 Italics are used to indicate procedures with more than one parent.
 Bold is used to indicate procedures which actually had allocations or page faults.
 Impl.Proc = x, y (o%) (z%):
  x = counts in Impl.Proc.
  y = counts in procedures called from Impl.Proc.
  o = x/ total % (only displayed if > 1%).
  z = (x + y)/ total = % time IN THE CALL STACK.

Statistics on execution of Cedar Spy:
 Processed log in 82.893 seconds. Total samples read from log = 5250.
 Average stack depth = 64.
 No. modules allocated = 78.
 No. procedures allocated = 341.
 Total words allocated = 10683.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Breakdown of interesting processes.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Process 311B running at priority [normal] = 4822 (91.8%).
CommandToolImpl.CommandToolBase = 4822 (91.8%).

Assorted processes = 187 (3.5%).

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Breakdown of interesting procedures.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

CommandToolImpl.CommandToolBase (1 refs) = 0, 4822 (91.8%).
(19831) ProcessPropsImpl.PushPropList = 4822 (91.8%).

ProcessPropsImpl.PushPropList (1 refs) = 0, 4822 (91.8%).
(821) CommandToolImpl.inner = 4822 (91.8%).

CommandToolImpl.inner (1 refs) = 0, 4822 (91.8%).
(19737) ReadEvalPrintImpl.MainLoop = 4822 (91.8%).

ReadEvalPrintImpl.MainLoop (1 refs) = 0, 4822 (91.8%).
(2848) ReadEvalPrintImpl.inner = 4822 (91.8%).

ReadEvalPrintImpl.inner (1 refs) = 0, 4822 (91.8%).
(2653) ReadEvalPrintImpl.MainLoopInternal = 4822 (91.8%).

ReadEvalPrintImpl.MainLoopInternal (1 refs) = 0, 4822 (91.8%).
(4783) CommandToolImpl.EachCommand = 4822 (91.8%).

CommandToolImpl.EachCommand (1 refs) = 0, 4822 (91.8%).
(8105) CommandToolImpl.ExecuteCommand = 4822 (91.8%).

CommandToolImpl.ExecuteCommand (1 refs) = 0, 4822 (91.8%).
(12982) CommandToolImpl.Base = 4822 (91.8%).

CommandToolImpl.Base (1 refs) = 0, 4822 (91.8%).
(12462) CommandToolImpl.innerExecute = 4822 (91.8%).

CommandToolImpl.innerExecute (1 refs) = 0, 4822 (91.8%).
(11765) PrintFileConvertImpl.Command = 4822 (91.8%).

PrintFileConvertImpl.Command (1 refs) = 0, 4822 (91.8%).
(16262) PrintFileConvertImpl.InterpressToPDAction = 4822 (91.8%).

PrintFileConvertImpl.InterpressToPDAction (1 refs) = 0, 4822 (91.8%).
(10660) ImagerPDImpl.DoPage = 4822 (91.8%).

ImagerPDImpl.DoPage (1 refs) = 0, 4822 (91.8%).
(11827) ImagerImpl.DoSaveAll = 4822 (91.8%).

ImagerImpl.DoSaveAll (1 refs) = 0, 4822 (91.8%).
(1924) ImagerStateImpl.StateDoSave = 4822 (91.8%).

ImagerStateImpl.StateDoSave (1 refs) = 0, 4822 (91.8%).
(2567) IPExecImpl.call = 125 (2.3%).
(2567) IPBaseImpl.action = 4697 (89.4%).

IPBaseImpl.action (1 refs) = 0, 4697 (89.4%).
. (2571) IPExecImpl.Do = 4697 (89.4%).
.
. IPExecImpl.Do (1 refs) = 0, 4697 (89.4%).
. (10713) IPExecImpl.ComposedDo = 4697 (89.4%).
.
. IPExecImpl.ComposedDo (1 refs) = 0, 4697 (89.4%).
. (11090) IPExecImpl.CallBody = 4697 (89.4%).
.
. IPExecImpl.CallBody (1 refs) = 0, 4697 (89.4%).
. (10188) IPExecImpl.CallInlineBody = 4696 (89.4%).
.
. IPExecImpl.CallInlineBody (1 refs) = 0, 4696 (89.4%).
. (9959) IPContextImpl.Call = 4696 (89.4%).
.
IPContextImpl.Call (2 refs) = 0, 4821 (91.8%).
(1297) IPExecImpl.action = 4821 (91.8%).

IPExecImpl.action (1 refs) = 0, 4821 (91.8%).
(9932) IPExecImpl.ExecuteInlineBody = 4821 (91.8%).

IPExecImpl.ExecuteInlineBody (1 refs) = 0, 4821 (91.8%).
(9151) IPExecImpl.ExecuteToEndOfBody = 4821 (91.8%).

IPExecImpl.ExecuteToEndOfBody (1 refs) = 23, 4798 (91.8%).
(8285) IPApplyImpl.Apply = 4725 (90.0%).

IPApplyImpl.Apply (1 refs) = 0, 4725 (90.0%).
. (4510) IPImageImpl.ApplyMASKRECTANGLE = 2467 (46.9%).
. (4510) IPBaseImpl.ApplyMAKESIMPLECO = 252 (4.8%).
. (4510) IPImageImpl.ApplyMASKSTROKECLOSED = 1973 (37.5%).
.
. IPImageImpl.ApplyMASKRECTANGLE (1 refs) = 0, 2467 (46.9%).
. ! (16133) ImagerImpl.MaskRectangle = 2467 (46.9%).
. !
. ! ImagerImpl.MaskRectangle (1 refs) = 0, 2467 (46.9%).
. ! (10332) ImagerRasterImpl.RasterMaskRectangle = 2467 (46.9%).
. !
. ! ImagerRasterImpl.RasterMaskRectangle (1 refs) = 0, 2467 (46.9%).
. ! (13259) ImagerPDImpl.MaskBoxes = 2467 (46.9%).
. !
. ! ImagerPDImpl.MaskBoxes (1 refs) = 0, 2467 (46.9%).
. ! (33527) ImagerRasterImpl.boxes = 2467 (46.9%).
. !
. ! ImagerRasterImpl.boxes (1 refs) = 0, 2467 (46.9%).
. ! (13188) ImagerRasterImpl.ClipBoxToMask = 2467 (46.9%).
. !
. ! ImagerRasterImpl.ClipBoxToMask (1 refs) = 0, 2467 (46.9%).
. ! (11587) ImagerPDImpl.hardBox = 2467 (46.9%).
. !
. ! ImagerPDImpl.hardBox (1 refs) = 0, 2467 (46.9%).
. ! (33473) ImagerPDImpl.MaskRuns = 2467 (46.9%).
. !
. IPImageImpl.ApplyMASKSTROKECLOSED (1 refs) = 0, 1973 (37.5%).
. ! (17660) IPImageImpl.MaskStroke = 1973 (37.5%).
. !
. ! IPImageImpl.MaskStroke (1 refs) = 0, 1973 (37.5%).
. ! (17379) ImagerImpl.MaskStroke = 1972 (37.5%).
. !
. ! ImagerImpl.MaskStroke (1 refs) = 0, 1972 (37.5%).
. ! (11395) ImagerRasterImpl.RasterMaskStroke = 1972 (37.5%).
. !
. ! ImagerRasterImpl.RasterMaskStroke (1 refs) = 1, 1971 (37.5%).
. ! (15692) ImagerRasterImpl.MaskRuns = 1967 (37.4%).
. !
. ! ImagerRasterImpl.MaskRuns (1 refs) = 0, 1967 (37.4%).
. ! (11162) ImagerRasterImpl.RunsFromPath = 1967 (37.4%).
. !
. ! ImagerRasterImpl.RunsFromPath (1 refs) = 0, 1967 (37.4%).
. ! (9611) ImagerScanConverterImpl.CreatePath = 444 (8.4%).
. ! (10728) ImagerRasterImpl.maskRunsAction = 1522 (28.9%).
. !
. ! ImagerRasterImpl.maskRunsAction (1 refs) = 0, 1522 (28.9%).
. ! ! (11063) ImagerPDImpl.MaskRuns = 1522 (28.9%).
. ! !
. ! ImagerScanConverterImpl.CreatePath (1 refs) = 2, 442 (8.4%).
. ! (16408) ImagerPathImpl.Transform = 428 (8.1%).
. !
. ! ImagerPathImpl.Transform (1 refs) = 1, 427 (8.1%).
. ! (6865) IPImageImpl.path = 414 (7.8%).
. !
. ! IPImageImpl.path (1 refs) = 0, 414 (7.8%).
. ! . (17250) IPStackImpl.DoTopPath = 414 (7.8%).
. ! .
. ! . IPStackImpl.DoTopPath (1 refs) = 2, 412 (7.8%).
. ! . (8349) ImagerPathImpl.TransformLineTo = 412 (7.8%).
. ! .
. ! . ImagerPathImpl.TransformLineTo (2 refs) = 19, 394 (7.8%).
. ! . (5944) ImagerScanConverterImpl.Line = 151 (2.8%).
. ! . (5985) ImagerStrokeImpl.Line = 236 (4.4%).
. ! .
. ! ImagerStrokeImpl.Line (2 refs) = 36, 207 (4.6%).
. ! . (6572) ImagerStrokeImpl.FindVertex = 61 (1.1%).
. ! . (6633) ImagerStrokeImpl.FindVertex = 57 (1.0%).
. ! .
. ! ImagerScanConverterImpl.Line (2 refs) = 57, 143 (3.8%).
. ! (15658) ImagerScanConverterImpl.AppendSegment = 143 (2.7%).
. !
. IPBaseImpl.ApplyMAKESIMPLECO (1 refs) = 0, 252 (4.8%).
. . (2148) IPExecImpl.GetInlineBody = 252 (4.8%).
. .
. . IPExecImpl.GetInlineBody (1 refs) = 0, 252 (4.8%).
. . (8952) IPMasterImpl.SkipToEndOfBody = 252 (4.8%).
. .
. . IPMasterImpl.SkipToEndOfBody (1 refs) = 22, 230 (4.8%).
. . (21077) IPMasterImpl.GetToken = 230 (4.3%).
. .
. ImagerPDImpl.MaskRuns (2 refs) = 1, 3988 (75.9%).
. (26936) PDFileWriterImpl.MaskRunGroup = 1521 (28.9%).
. (29600) ImagerPDImpl.runs = 2467 (46.9%).
.
. ImagerPDImpl.runs (1 refs) = 0, 2467 (46.9%).
. ! (33427) ImagerMaskImpl.RunsFromBox = 2467 (46.9%).
. !
. ! ImagerMaskImpl.RunsFromBox (1 refs) = 0, 2467 (46.9%).
. ! (3106) ImagerPDImpl.pdSampledRun = 2467 (46.9%).
. !
. ! ImagerPDImpl.pdSampledRun (1 refs) = 3, 2464 (46.9%).
. ! (27844) ImagerSampleImpl.GetPointSamples = 1546 (29.4%).
. ! (27940) ImagerPDImpl.GetBrickSamples = 67 (1.2%).
. ! (28062) ImagerSampleImpl.SubSamples = 534 (10.1%).
. ! (28296) ImagerSampleImpl.UnsafePutFSign = 269 (5.1%).
. !
. ! ImagerSampleImpl.GetPointSamples (1 refs) = 1543, 3 (29.3%) (29.4%).
. ! !
. ! ImagerSampleImpl.SubSamples (1 refs) = 1, 533 (10.1%).
. ! ! (4332) ImagerSampleImpl.UnsafeSub = 532 (10.1%).
. ! !
. ! ! ImagerSampleImpl.UnsafeSub (1 refs) = 532 (10.1%).
. ! !
. ! ImagerSampleImpl.UnsafePutFSign (1 refs) = 269 (5.1%).
. !
. PDFileWriterImpl.MaskRunGroup (1 refs) = 0, 1521 (28.9%).
. . (16273) ImagerRasterImpl.runs = 1520 (28.9%).
. .
. . ImagerRasterImpl.runs (1 refs) = 0, 1520 (28.9%).
. . (9976) ImagerScanConverterImpl.ConvertToRuns = 1520 (28.9%).
. .
. . ImagerScanConverterImpl.ConvertToRuns (1 refs) = 0, 1520 (28.9%).
. . (24103) ImagerScanConverterImpl.Convert = 1520 (28.9%).
. .
. . ImagerScanConverterImpl.Convert (1 refs) = 422, 1098 (8.0%) (28.9%).
. . (19995) ImagerScanConverterImpl.InitialBucketTable = 71 (1.3%).
. . (22595) ImagerScanConverterImpl.Result = 979 (18.6%).
. .
. . ImagerScanConverterImpl.Result (1 refs) = 232, 747 (4.4%) (18.6%).
. . (23626) ImagerScanConverterImpl.ShellSort = 291 (5.5%).
. . (24026) PDFileWriterImpl.CaptureRun = 456 (8.6%).
. .
. . PDFileWriterImpl.CaptureRun (1 refs) = 207, 249 (3.9%) (8.6%).
. . ! (15461) PDFileWriterImpl.ExtendBB = 120 (2.2%).
. . ! (15461) PDFileWriterImpl.ExtendBB = 89 (1.6%).
. . !
. . ImagerScanConverterImpl.ShellSort (1 refs) = 291 (5.5%).
. .
. PDFileWriterImpl.ExtendBB (3 refs) = 212 (4.0%).
.
IPMasterImpl.GetToken (2 refs) = 96, 183 (5.3%).
(19025) IOCommonImpl.GetIndex = 54 (1.0%).
(19059) IOCommonImpl.GetChar = 80 (1.5%).


The remaining procedures had less than 156 wakeups.