Annotation of 43BSD/ucb/fp/fpMeasures.l, revision 1.1.1.1

1.1       root        1: ;  FP interpreter/compiler
                      2: ;  Copyright (c) 1982  Scott B. Baden
                      3: ;  Berkeley, California
                      4: ;  Dynamics Statistics by Dorab Patel (UCLA)
                      5: ;
                      6: ;  Copyright (c) 1982 Regents of the University of California.
                      7: ;  All rights reserved.  The Berkeley software License Agreement
                      8: ;  specifies the terms and conditions for redistribution.
                      9: ;
                     10: (setq SCCS-fpMeasures.l "@(#)fpMeasures.l      5.1 (Berkeley) 5/31/85")
                     11: 
                     12: ; Initialize and update the 'Measures' plist  with
                     13: ; the run-time measurement data
                     14: ;
                     15: ; Special symbol 'TracedFns' also manipulated
                     16: ; It contains the list of currently traced user defined functions.
                     17: ; The attributes for each functional form and function are:
                     18: 
                     19: ; times: the total number of times it has been called
                     20: ; size: the sum of the top-level sizes of the arguments given to it
                     21: ; funargno: the number of functional arguments to this form
                     22: ;              (in general this is only for construct)
                     23: ; funargtype: the type and total number of functions of that type
                     24: ;              supplied to this functional form.
                     25: ;              This is an alist ((fntype.times) ...)
                     26: 
                     27: 
                     28: 
                     29: (include specials.l)
                     30: (declare (special statport dummy))
                     31: (declare (localf InitSize InitFunArgTyp 
                     32:                 InitFunArgNo trace1
                     33:                 extractName goodStats
                     34:                 untrace1 SendMeasures))
                     35: 
                     36: 
                     37: ; The following functions are global. i.e. used externally
                     38: ; startDynStats        clrDynStats     IncrTimes       IncrSize
                     39: ; IncrFunArgNo IncrFunArgTyp   size            Trace
                     40: ; PrintMeasures        IncrUDF         Untrace         stopDynStats
                     41: 
                     42: ; This is called by the main routine to initialize all the
                     43: ; measurement stuff
                     44: 
                     45: 
                     46: (defun clrDynStats nil
                     47:   (dontLoseStats)
                     48:   (initStats))
                     49: 
                     50: 
                     51: (defun dontLoseStats nil
                     52:   (cond ((goodStats) ; check to see if there are stats to report
                     53:         (patom "output dynamic statistics? ")
                     54:         (let ((response (car (explodec (ratom)))))
                     55:              (If ptport then (msg (P ptport) response))
                     56:              
                     57:              (Tyi)
                     58:              (cond ((eq response 'y)
                     59:                     (patom "File: ")
                     60:                     (let ((statFile 
                     61:                            (cond ((eq (tyipeek) #.CR) nil)
                     62:                                  (t 
                     63:                                   (let ((fl (ratom)))
                     64:                                        (If ptport then (msg (P ptport) fl))
                     65:                                        fl)))))
                     66:                          (Tyi)
                     67:                          (PrintMeasures statFile))))))))
                     68: 
                     69: (defun initStats nil
                     70:   
                     71:   (InitMeasures 
                     72:    `(,@#.dyadFns
                     73:      ,@#.miscFns
                     74:      ,@#.multiAdicFns
                     75:      ,@#.libFns
                     76:      ,@#.funcForms))
                     77:   
                     78:   (InitSize #.multiAdicFns)
                     79:   (InitSize #.funcForms)
                     80:   (InitFunArgNo '(constr$fp))
                     81:   
                     82:   ; included here even though it's not  a functional form
                     83:   (InitFunArgTyp '(select$fp))
                     84:   
                     85:   (InitFunArgTyp #.funcForms))
                     86: 
                     87: 
                     88: ; Makes the symbol 'Measures'  have the property indicators
                     89: ; corresponding to  the function names in 'ListOfFns' and the values
                     90: ; to be ((times.0)).
                     91: 
                     92: (defun InitMeasures (ListOfFns)
                     93:   (setplist 'Measures
                     94:             (apply 'append 
                     95:                   (mapcar '(lambda (x) (list  x (list (cons 'times 0)))) 
                     96:                           ListOfFns))))
                     97: 
                     98: (defun goodStats nil
                     99:   (do ((M (plist 'Measures) (cddr M)))
                    100:       ((null M) nil)
                    101:       (cond ((not (zerop (cdr (assoc 'times (cadr M)))))
                    102:             (return t)))))
                    103: 
                    104: 
                    105: ; This is used to stop the collection of dynamic statistics
                    106: ; needs to untrace functions if they still are. i.e. do the traced-expr stuff
                    107: ; note that rds which calls this, also calls PrintMeasures, though
                    108: ; this may change.
                    109: 
                    110: (defun stopDynStats nil
                    111:   (cond (TracedFns             ; if any fns still being traced
                    112:         (Untrace TracedFns)))  ; untrace them
                    113:   (setq DynTraceFlg nil))
                    114: 
                    115: (defun extractName (fnName)
                    116:   (patom 
                    117:    (implode (reverse (cons "'" (cdddr (reverse (explodec (concat "'" fnName)))))))))
                    118: 
                    119: ; this is the function called by the system function trace to
                    120: ; enable the tracing of the User Defined Functions specified
                    121: ; NOTE: successive calls will add to the UDFs to be traced.
                    122: 
                    123: (defun Trace (arglist)
                    124:   (setq traceport poport)
                    125:   (mapc '(lambda (x)
                    126:                 (cond ((memq x TracedFns) ; if already traced
                    127:                        (setq arglist 
                    128:                              (delq x arglist 1)) ; delete from arglist
                    129:                        (extractName x)           ; and tell the user
                    130:                        (patom " is already being traced")
                    131:                        (terpr))))
                    132:        arglist)
                    133:   (mapc 'trace1 arglist)) ; set up traced-expr stuff
                    134: 
                    135: ; This is called by the system function untrace to disable the tracing
                    136: ; of user defined functions.
                    137: ; This removes the named user defined function from the list
                    138: ; of traced functions
                    139: 
                    140: (defun Untrace (arglist)
                    141:   (mapc '(lambda (x)
                    142:                 (cond ((memq x TracedFns) ; if being traced
                    143:                        (setq TracedFns (delq x TracedFns)) ; remove
                    144:                        (untrace1 x)) ; restore stuff
                    145:                       (t (extractName x) ; else complain
                    146:                          (patom " is not being traced")
                    147:                          (terpr))))
                    148:        arglist))
                    149: 
                    150: ; This is called by Trace on each individual function that is to
                    151: ; be traced. It does the manipulation of the traced-expr property
                    152: 
                    153: (defun trace1 (name)
                    154:   ; actually you should check for getd name returning something decent
                    155:   (let ((zExpr (getd name)))
                    156:        (cond ((null zExpr)
                    157:              (patom "Can't trace the undefined fn ")
                    158:              (extractName name)
                    159:              (patom ".")
                    160:              (terpr))
                    161:             
                    162:             (t
                    163:              (putprop name zExpr 'traced-expr) ; put fn def on traced-expr
                    164:              (setq TracedFns (append1 TracedFns name)) ; update TracedFns
                    165:              (InitUDF name)                    ; set up the measurement stuff
                    166:              (putd name  ; make a new function def
                    167:                    `(lambda (x)
                    168:                             (prog (tmp)
                    169:                                   (setq level (1+ level)) ; increment level counter
                    170:                                   (printLevel)
                    171:                                   (patom " >Enter> " traceport)
                    172:                                   (patom (extName ',name) traceport)
                    173:                                   (patom " [" traceport)
                    174:                                   (d_isplay x traceport)
                    175:                                   (patom "]" traceport)
                    176:                                   (terpri traceport)
                    177:                                   ; now call the actual function
                    178:                                   (setq tmp (funcall (get ',name 'traced-expr) x))
                    179:                                   (printLevel)
                    180:                                   (patom " <EXIT<  " traceport) ; now print epilog
                    181:                                   (patom (extName ',name) traceport)
                    182:                                   (patom "  " traceport)
                    183:                                   (d_isplay tmp traceport)
                    184:                                   (terpri traceport)
                    185:                                   (return tmp)))))))) ; return the return value
                    186: 
                    187: 
                    188: 
                    189: (defun extName (fnName)
                    190:   (let ((zzName (reverse (explodec fnName))))
                    191:        (cond ((memq '$ zzName) (implode (reverse (cdr (memq '$ zzName)))))
                    192:             (t (implode (reverse (cdr (memq '_ zzName))))))))
                    193: 
                    194: 
                    195: (defun printLevel nil
                    196:   (do ((counter 1 (1+ counter)))
                    197:       ((eq counter level) (patom level traceport))
                    198:       (cond ((oddp counter) (patom "|" traceport))
                    199:            (t (patom " " traceport)))))
                    200: 
                    201: ; This is called by Untrace for each individaul function to be untraced.
                    202: ; It handles the traced-expr property hassles.
                    203: 
                    204: (defun untrace1 (name)
                    205:   (let ((tmp (get name 'traced-expr)))
                    206:        (cond ((null tmp) ; if the traced-expr property is unreasonable
                    207:              ; a better check for unreasonableness is needed
                    208:              (extractName name) ; complain
                    209:              (patom " was not traced properly - cant restore")
                    210:              (terpr))
                    211:             (t (putd name tmp) ; else restore and remove the traced-expr
                    212:                (remprop name 'traced-expr)))))
                    213: 
                    214: ; sz is a function that returns the total number of atoms in its argument
                    215: 
                    216: (defun sz (x)
                    217:   (cond ((null x) 0)
                    218:        ((atom x) 1)
                    219:        (t (add (size (car x))
                    220:                (size (cdr x))))))
                    221: 
                    222: ; inc is a macro used by the increment functions
                    223: 
                    224: (defmacro inc (x)
                    225:   `(rplacd ,x (1+ (cdr ,x))))
                    226: 
                    227: ; inctimes is a macro used by IncrFunArgNo
                    228: 
                    229: (defmacro inctimes (x times)
                    230:   `(rplacd ,x (add times (cdr ,x))))
                    231: 
                    232: ; increment the 'funargno' attribute of the functional form 
                    233: 
                    234: (defun IncrFunArgNo (fform times)
                    235:   (inctimes (sassq 'funargno
                    236:                   (get 'Measures fform)
                    237:                   '(lambda ()
                    238:                            (cprintf "error: %s has no funargno"
                    239:                                     fform)
                    240:                            (terpr)
                    241:                            (break)))
                    242:            times))
                    243: 
                    244: ; increment the 'funargtyp' information of the functional form
                    245: ; if the particular function/form has never yet been used with his
                    246: ; functional form, create the entry
                    247: 
                    248: (defun IncrFunArgTyp (fform funct)
                    249:   (inc (sassoc funct ; get (fn.#oftimes). This has to be sassoc NOT sassq.
                    250:               (cadr (sassq 'funargtyp  ; get (funargtyp ...)
                    251:                            (get 'Measures fform)
                    252:                            '(lambda ()
                    253:                                     (cprintf "error: %s has no funargtyp"
                    254:                                              fform)
                    255:                                     (terpr)
                    256:                                     (break))))
                    257:               ; 'funargtyp' was there but not the funct
                    258:               ; should return (fn.#oftimes)
                    259:               '(lambda ()
                    260:                        (cond ((setq dummy (cadr (assq 'funargtyp
                    261:                                                       (get 'Measures fform))))
                    262:                               ; the alist is not empty and we
                    263:                               ; know that funct was not there
                    264:                               (assq funct
                    265:                                     (nconc dummy
                    266:                                            (list (cons funct 0)))))
                    267:                              ; the alist is empty, so add the element
                    268:                              (t (assq funct
                    269:                                       (cadr (nconc (assq 'funargtyp
                    270:                                                          (get 'Measures fform))
                    271:                                                    (list (list (cons funct 0))))))))))))
                    272: ; increment the 'times' attribute of the function
                    273: 
                    274: (defun IncrTimes (funct)
                    275:   (inc (assq 'times (get 'Measures funct))))
                    276: 
                    277: ; update the 'avg arg size' attribute of the function
                    278: ; actually it is the total size. it should be divided by the 'times'
                    279: ; attribute to get the avg size.
                    280: 
                    281: (defun IncrSize (funct size)
                    282:   (rplacd (assq 'size (get 'Measures funct))
                    283:          (add (cdr (assq 'size (get 'Measures funct)))
                    284:               size)))
                    285: 
                    286: ; This adds the given function as a property of Measures and
                    287: ; initializes it to have the 'times' and 'size' attributes.
                    288: 
                    289: (defun InitUDF (UDF)
                    290:   (putprop 'Measures '((times . 0) (size . 0)) UDF))
                    291: 
                    292: 
                    293: ; This increments the times and the size atribute of a UDF, if it exists 
                    294: ; Otherwise, it does nothing.
                    295: 
                    296: (defun IncrUDF (UDF seq)
                    297:   (cond 
                    298:    ((and (memq UDF TracedFns) (get 'Measures UDF)) ;if the UDF is traceable
                    299:     (IncrTimes UDF)
                    300:     (IncrSize UDF (size seq)))))
                    301: 
                    302: ; This adds the 'size' attribute to the alist corresponding to each
                    303: ; function in 'FnList' and initializes the value to 0.
                    304: 
                    305: (defun InitSize (FnList)
                    306:   (mapcar '(lambda (funct) (nconc (get 'Measures funct) (list (cons 'size 0))))
                    307:          FnList))
                    308: 
                    309: ; This adds the 'funargtyp' (functional argument type) attribute to
                    310: ; the alist corresponding to each functional form in 'FnFormList' and
                    311: ; initializes the value to nil.
                    312: 
                    313: (defun InitFunArgTyp (FnFormList)
                    314:   (mapcar '(lambda (fform)
                    315:                   (nconc (get 'Measures fform)
                    316:                          (list (list 'funargtyp))))
                    317:          FnFormList))
                    318: 
                    319: ; This adds the 'funargno' (number of functional args) attribute to
                    320: ; the alist correphsponding to each functional form in 'FnFormList'
                    321: ; and initializes the value to 0.
                    322: 
                    323: (defun InitFunArgNo (FnFormList)
                    324:   (mapcar '(lambda (fform)
                    325:                   (nconc (get 'Measures fform)
                    326:                          (list (cons 'funargno 0))))
                    327:          FnFormList))
                    328: 
                    329: ; Prints out the stats to a file
                    330: 
                    331: (defun PrintMeasures (sFileName)
                    332:   (cond (sFileName
                    333:         (let ((statPort nil))
                    334:              (cond ((setq statPort (outfile sFileName 'append))
                    335:                     (SendMeasures statPort) ; write the stuff
                    336:                     (terpri statPort)
                    337:                     (close statPort))
                    338:                    (t (terpr)
                    339:                       (patom "Cannot open statFile")
                    340:                       (terpr)))))
                    341:        (t (SendMeasures nil))))
                    342: 
                    343: 
                    344: ; Traverses the Measures structure and prints out the
                    345: ; info onto 'port'.
                    346: ; Also removes the attributes from Measures (during traversal)
                    347: 
                    348: (defun SendMeasures (port)
                    349:   (do ((functlist (plist 'Measures) 
                    350:                  (cddr functlist)));for each alternate elem in functlist
                    351:       ((null functlist)) ; end when all done
                    352:       (let ((fnStats (cadr functlist)))
                    353:           (cond ((and fnStats (not (zerop (cdr (assoc 'times fnStats)))))
                    354:                  (cprintf "%s:" (printName (car functlist)) port)
                    355:                  (do ((proplist fnStats (cdr proplist)))
                    356:                      ((null proplist))
                    357:                      (let ((prop (car proplist))) ; for each prop in proplist
                    358:                           (cond ((eq (car prop) 'funargtyp) ; if it is funargtyp
                    359:                                  (doFuncArg port prop))
                    360:                                 (t (cprintf "  %s" (car prop) port);if not funargtyp
                    361:                                    (cprintf "  %d" (cdr prop) port)))))
                    362:                  ; end of function
                    363:                  (terpri port)
                    364:                  (terpri port)))))); a newline separates functions
                    365: 
                    366: (defun doFuncArg (port prop)
                    367:   (terpri port)
                    368:   (terpri port)
                    369:   (cprintf "                   Functional Args" nil port)
                    370:   (terpri port)
                    371:   (cprintf "           Name                    Times" nil port)
                    372:   (terpri port)
                    373:   (do ((funclist (cadr prop) (cdr funclist)))
                    374:       ((null funclist))
                    375:       (cprintf "               " nil port)
                    376:       (patom (printName (caar funclist)) port)
                    377:       (cprintf "                       %d" (cdar funclist) port)
                    378:       (terpri port)))
                    379: 
                    380: (defun printName (fnName)
                    381:   (let ((zzName (reverse (explodec fnName)))
                    382:        (tName nil))
                    383:        (setq tName (memq '$ zzName))
                    384:        (cond (tName (implode (reverse (cdr tName))))
                    385:             (t 
                    386:              (setq tName (memq '_ zzName))
                    387:              (cond (tName (implode (reverse (cdr tName))))
                    388:                    ((stringp fnName) (concat '|"| fnName '|"|))
                    389:                    (t (put_obj fnName)))))))
                    390: 
                    391: ; this is the same as the function in fp_main.l except that it takes
                    392: ; an extra argument which is the port name. it is used for printing
                    393: ; out a lisp object in the FP form
                    394: 
                    395: (defun d_isplay (obj port)
                    396:   (cond ((null obj) (patom "<>" port))
                    397:        ((atom obj) (patom obj port))
                    398:        ((listp obj)
                    399:         (patom "<" port)
                    400:         (maplist 
                    401:          '(lambda (x) 
                    402:                   (d_isplay (car x) port)
                    403:                   (cond ((not (onep (length x))) (patom " " port)))) obj)
                    404:         (patom ">" port))))
                    405: 
                    406: 
                    407: (defun measAlph (al seq)
                    408:   (IncrFunArgTyp 'alpha$fp al)
                    409:   (IncrTimes 'alpha$fp)
                    410:   (IncrSize 'alpha$fp (size seq)))
                    411: 
                    412: (defun measIns (ins seq)
                    413:   (IncrFunArgTyp 'insert$fp ins)
                    414:   (IncrTimes 'insert$fp)
                    415:   (IncrSize 'insert$fp (size seq)))
                    416: 
                    417: (defun measTi (ains seq)
                    418:   (IncrFunArgTyp 'ti$fp ains)
                    419:   (IncrTimes 'ti$fp)
                    420:   (IncrSize 'ti$fp (size seq)))
                    421: 
                    422: (defun measSel (sel seq)
                    423:   (IncrFunArgTyp 'select$fp sel)
                    424:   (IncrTimes 'select$fp)
                    425:   (IncrSize 'select$fp (size seq)))
                    426: 
                    427: (defun measCons (cons seq)
                    428:   (IncrFunArgTyp 'constant$fp cons)
                    429:   (IncrTimes 'constant$fp)
                    430:   (IncrSize 'constant$fp (size seq)))
                    431: 
                    432: (defun measCond (c1 c2 c3 seq)
                    433:   (IncrFunArgTyp 'condit$fp c1)
                    434:   (IncrFunArgTyp 'condit$fp c2)
                    435:   (IncrFunArgTyp 'condit$fp c3)
                    436:   (IncrTimes 'condit$fp)
                    437:   (IncrSize 'condit$fp (size seq)))
                    438: 
                    439: (defun measWhile (w1 w2 seq)
                    440:   (IncrFunArgTyp 'while$fp  w1)
                    441:   (IncrFunArgTyp 'while$fp  w2)
                    442:   (IncrTimes 'while$fp)
                    443:   (IncrSize 'while$fp (size seq)))
                    444: 
                    445: (defun measComp (cm1 cm2 seq)
                    446:   (IncrFunArgTyp 'compos$fp cm1)
                    447:   (IncrFunArgTyp 'compos$fp cm2)
                    448:   (IncrTimes 'compos$fp)
                    449:   (IncrSize 'compos$fp (size seq)))
                    450: 
                    451: (defun measConstr (fns seq)
                    452:   (mapcar '(lambda (x) (IncrFunArgTyp 'constr$fp x)) fns)
                    453:   (IncrFunArgNo 'constr$fp (length fns))
                    454:   (IncrTimes 'constr$fp)
                    455:   (IncrSize 'constr$fp (size seq)))
                    456: 
                    457: ; get the corect name of the functional form
                    458: 
                    459: (defmacro getFform (xx)
                    460:   `(implode (nreverse `(p f ,@(cdr (nreverse (explodec (cxr 0 ,xx))))))))
                    461: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.