DIRECTORY DragomanOpDebug, DragomanPrivate, DragomanRefTab, AMBridge, AMTypes, Basics, BasicTime, Convert, IO, ListerUtils, PrincOps, PrintTV, Rope; DragomanStats: CEDAR PROGRAM IMPORTS DragomanRefTab, DragomanOpDebug, AMBridge, BasicTime, Convert, IO, PrintTV EXPORTS DragomanPrivate = BEGIN ROPE: TYPE = Rope.ROPE; STREAM: TYPE = IO.STREAM; Byte: TYPE = Basics.Byte; Machine: TYPE = DragomanPrivate.Machine; PrintByColumns: PUBLIC PROC [ os: STREAM, PrintOne: PROC [os: STREAM, item: CARDINAL, lastOnLine: BOOL], firstItem, nItems, nColumns, spaceBetween: CARDINAL] = { i, j, nc: CARDINAL; delta: CARDINAL _ (nItems + nColumns - 1) / nColumns; last: BOOL; FOR i IN [0..delta) DO nc _ 0; last _ FALSE; FOR j _ i, j + delta WHILE ~last AND j < nItems DO nc _ nc + 1; last _ nc = nColumns; PrintOne[os, firstItem + j, last]; IF ~last THEN THROUGH [0..spaceBetween] DO os.PutChar[' ]; ENDLOOP; ENDLOOP; os.PutChar['\n]; ENDLOOP; }; Sort: PUBLIC PROC [ a: LONG DESCRIPTOR FOR ARRAY OF REF, After: PROC [REF, REF] RETURNS [BOOL]] = TRUSTED { n: CARDINAL = LENGTH[a]; i: CARDINAL; temp: REF ANY; SiftUp: PROC [l, u: CARDINAL] = TRUSTED { s: CARDINAL; key: REF ANY _ a[l-1]; DO s _ l*2; IF s > u THEN EXIT; IF s < u AND After[a[s+1-1], a[s-1]] THEN s _ s+1; IF After[key, a[s-1]] THEN EXIT; a[l-1] _ a[s-1]; l _ s; ENDLOOP; a[l-1] _ key}; FOR i DECREASING IN [2..n/2] DO SiftUp[i, n]; ENDLOOP; FOR i DECREASING IN [2..n] DO SiftUp[1, i]; temp _ a[1-1]; a[1-1] _ a[i-1]; a[i-1] _ temp; ENDLOOP; }; PrintOpCounts: PUBLIC PROC [os: STREAM, m: DragomanPrivate.Machine] = TRUSTED { OpItemRec: TYPE = RECORD [op: Byte, count: INT, cumPct: REAL]; OpItemSeq: TYPE = RECORD [SEQUENCE n: CARDINAL OF REF OpItemRec]; oseq: REF OpItemSeq _ NIL; total: INT_ 0; rTotal: REAL; nonZ: CARDINAL _ 0; oc: REF ARRAY Byte OF INT = m.opCount; opData: ListerUtils.OpCodeArray _ DragomanOpDebug.OpData[]; SmallerCount: PROC [i1, i2: REF OpItemRec] RETURNS [BOOL] = TRUSTED { RETURN [i1.count < i2.count]}; PrintOpItem: PROC [os: STREAM, item: CARDINAL, lastOnLine: BOOL] = TRUSTED { op: Byte = oseq[item].op; count: INT = oseq[item].count; opName: ROPE = opData[op].name; os.PutF["%9g %5g %5g %-6g", [integer[count]], [rope[Convert.RopeFromReal[(oseq[item].count/rTotal)*100, 3]]], [rope[Convert.RopeFromReal[oseq[item].cumPct, 3]]], [rope[opName]]]}; FOR i: CARDINAL IN Byte DO IF oc[i] # 0 THEN { nonZ _ nonZ + 1; total _ total + oc[i]}; ENDLOOP; IF nonZ = 0 THEN RETURN; rTotal _ total; total _ 0; oseq _ NEW [OpItemSeq[nonZ]]; nonZ _ 0; FOR i: CARDINAL IN Byte DO IF oc[i] # 0 THEN { oseq[nonZ] _ NEW [OpItemRec _ [op: i, count: oc[i], cumPct: NULL]]; nonZ _ nonZ + 1}; ENDLOOP; Sort[a: LOOPHOLE[DESCRIPTOR[oseq]], After: LOOPHOLE[SmallerCount]]; FOR i: CARDINAL IN [0..nonZ) DO count: INT = oseq[i].count; total _ total + count; oseq[i].cumPct _ (total / rTotal) * 100; ENDLOOP; os.PutF[ " %g outward calls\n", IO.int[m.outCalls]]; PrintByColumns[ os: os, PrintOne: PrintOpItem, firstItem: 0, nItems: nonZ, nColumns: 2, spaceBetween: 0]; }; PrintProcCounts: PUBLIC PROC [os: STREAM, m: Machine] = TRUSTED { lc: DragomanRefTab.Ref; LinkItemRec: TYPE = RECORD [link: PrincOps.ControlLink, count: LONG CARDINAL, time: LONG CARDINAL]; LinkItemSeq: TYPE = RECORD [SEQUENCE n: CARDINAL OF REF LinkItemRec]; ShortOctal: PROC [n: CARDINAL] RETURNS [IO.Value] = TRUSTED { RETURN [[rope[Convert.RopeFromInt[n, 8, n>7]]]]}; SmallerCount: PROC [i1, i2: REF LinkItemRec] RETURNS [BOOL] = TRUSTED { RETURN [i1.time < i2.time]}; lseq: REF LinkItemSeq _ NIL; n: CARDINAL _ 0; CountItems: DragomanRefTab.EachPairAction = TRUSTED {IF val.lCount#0 AND val.time>=1000 THEN n _ n+1; RETURN[FALSE]}; InsertItem: DragomanRefTab.EachPairAction = TRUSTED { IF val.lCount = 0 OR val.time<1000 THEN RETURN[FALSE]; lseq[n] _ NEW[LinkItemRec _ [link: key.link, count: val.lCount, time: val.time]]; n _ n+1; RETURN[FALSE]}; TRUSTED {lc _ LOOPHOLE[m.xferData]}; IF lc = NIL THEN { os.PutRope["Not remembering Xfers"]; RETURN}; [] _ DragomanRefTab.Pairs[lc, CountItems]; lseq _ NEW [LinkItemSeq[n]]; n _ 0; [] _ DragomanRefTab.Pairs[lc, InsertItem]; Sort[a: LOOPHOLE[DESCRIPTOR[lseq]], After: LOOPHOLE[SmallerCount]]; os.PutF["\n 10 time consuming outward calls from interpreter (%g total)\t\t[ms, #, gfi, name]\n", [integer[m.outCalls]]]; FOR i: CARDINAL IN [0 .. MIN[10, n]) DO item: REF LinkItemRec = lseq[i]; tv: AMTypes.TV _ AMBridge.TVForProc[LOOPHOLE[item.link]]; os.PutF["%8g\t%8g\t%4g\t", [cardinal[BasicTime.PulsesToMicroseconds[item.time]/1000]], [cardinal[item.count]], [integer[item.link.gfi]]]; PrintTV.Print[tv, os]; os.PutF["\n"]; ENDLOOP; os.PutRope["~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"]; }; END. €DragomanStats.mesa Last Edited by: Sweet, March 4, 1985 4:29:04 pm PST Bertrand Serlet August 5, 1985 1:02:01 pm PDT TreeSort3, -1's to fake 1 origin arrays. Κ(– "Cedar" style˜code– "Cedar" stylešœ™K™3K™-—K˜šΟk ˜ K˜K˜Kšœ˜K˜ K˜K˜Kšœ ˜ Kšœ˜Kšœ˜K˜ K˜ K˜Kšœ˜—šœ œ˜ Kšœ@œ ˜RKšœ˜—Kš˜Kšœœœ˜Kšœœœœ˜Kšœœ˜Kšœ œ˜(K˜šΟnœœœ˜Kšœœ˜ Kš žœœœœœ˜>Kšœ+œ˜8Kšœ œ˜Kšœœ&˜5Kšœœ˜ šœœ ˜K˜Kšœœ˜ šœœœ ˜2K˜ K˜K˜"Kš œœœœœ˜DKšœ˜—K˜Kšœ˜—K˜K˜—šžœœœ˜Kš œœœœœœ˜$Kšžœœœœœœœ˜2Kšœ(™(Kšœœœ˜Kšœœ˜ Kšœœ˜šžœœœœ˜)Kšœœ˜ Kšœœœ ˜š˜K˜Kšœœœ˜Kšœœœ ˜2Kšœœœ˜ K˜K˜Kšœ˜—K˜—Kš œ œœ œœ˜6šœ œœ˜K˜ K˜K˜K˜Kšœ˜—K˜K˜—š ž œœœœ œ˜OKš œ œœœ œ˜>Kš œ œœœœœœ ˜AKšœœ œ˜Kšœœ˜Kšœœ˜ Kšœœ˜Kš œœœœœ ˜&K˜;š ž œœ œ œœœ˜EKšœ˜—š ž œœœœœœ˜LK˜Kšœœ˜Kšœœ˜šœ˜Kšœ˜Kšœ@˜@Kšœ4˜4Kšœ˜——šœœœ˜šœ œ˜Kšœ˜Kšœ˜—Kšœ˜—Kšœ œœ˜K˜K˜ Kšœœ˜K˜ šœœœ˜šœ œ˜Kšœ œ,œ˜CKšœ˜—Kšœ˜—Kšœœ œœ˜Cšœœœ ˜Kšœœ˜K˜K˜(Kšœ˜—˜K˜+—˜K˜Y—K˜K˜—š žœœœœœ˜AKšœ˜Kš œ œœ%œœœœ˜cKš œ œœœœœœ˜Eš ž œœœœœ œ˜=Kšœ+˜1K˜—š ž œœ œœœœ˜GKšœ˜—Kšœœœ˜Kšœœ˜KšΟb œ"œœœœ œœ˜ušž œ"œ˜5Kš œœœœœ˜6Kšœ œD˜QKšœ œœ˜—Kšœœ˜$šœœœ˜K˜$Kšœ˜—K˜*Kšœœ˜K˜Kšœ*˜*Kšœœ œœ˜CK˜yšœœœ˜'Kšœœ˜ Kšœ œœ ˜9šœ˜Kšœ<˜