⍝ Performance profiling:

⍝ [profile] uses ⎕← to display profiling information in the session.
⍝ For testing, we modify the temporary copy of the operator in this
⍝ namespace to output profiling information directly as result. The
⍝ second (timing) column is removed from the result. Otherwise, small
⍝ variations in timing would cause the test to fail.

    s1 ← '⎕←trim⍕vcol,tcol' 'vcol'          ⍝ remove timing column
    s2 ← '1:shy←rslt⊣'      '⍪'             ⍝ return profiling information
    ⎕fx s1 subs s2 subs ⎕cr'profile'        ⍝ fix modified profile operator

    1 disp profile'disp' ⍳2 3 4             ⍝ hits for 1 disp ⍳2 3 4
┌──────────────────────────────────────────────────────────────────────────────────┐
│ 1 disp←{⎕IO ⎕ML←0 1                           ⍝ Boxed sketch of nested array.    │
│ 1                                                                                │
│ 1     ⍺←⍬ ⋄ dec ctd←2↑⍺                       ⍝ 1:decorated, 1:centred.          │
│ 1                                                                                │
│25     box←{                                   ⍝ Recursive boxing of nested array.│
│25         isor ⍵:⎕FMT⊂⍵                       ⍝ ⎕or: '∇name'.                    │
│25         1=≡,⍵:dec open ⎕FMT dec open ⍵      ⍝ simple array: format.            │
│ 1         mat←matr 1/dec open ⍵               ⍝ matrix of opened subarrays.      │
│ 1         r c←×⍴mat                           ⍝ non-null rows/cols.              │
│ 1         dec<0∊r c:c/r⌿∇ 1 open mat          ⍝ undecorated null: empty result.  │
│ 1         subs←aligned ∇¨mat                  ⍝ aligned boxed subarrays.         │
│ 1         (≢⍴⍵)gaps ⍵ plane subs              ⍝ collection into single plane.    │
│ 1     }                                                                          │
│ 1                                                                                │
│ 1     aligned←{                               ⍝ Alignment and centring.          │
│ 1         rows cols←sepr⍴¨⍵                   ⍝ subarray dimensions.             │
│ 1         sizes←(⌈/rows)∘.,⌈⌿cols             ⍝ aligned subarray sizes.          │
│ 1         ctd=0:sizes↑¨⍵                      ⍝ top-left alignment.              │
│           v h←sepr⌈0.5×↑(⍴¨⍵)-sizes           ⍝ vertical and horizontal rotation.│
│           v⊖¨h⌽¨sizes↑¨⍵                      ⍝ centred aligned subarrays.       │
│ 1     }                                                                          │
│ 1                                                                                │
│ 3     gaps←{                                  ⍝ Gap-separated sub-planes.        │
│ 3         ⍺≤2:⍵                               ⍝ lowish rank: done.               │
│ 1         subs←(⍺-1)∇¨⍵                       ⍝ sub-hyperplanes.                 │
│ 1         width←⊃⌽⍴⊃subs                      ⍝ width of inter-plane gap.        │
│ 1         fill←(⍺ width-3 0)⍴' '              ⍝ inter-plane gap.                 │
│ 1         ↑{⍺⍪fill⍪⍵}/1 open subs             ⍝ gap-separated planes.            │
│ 1     }                                                                          │
│ 1                                                                                │
│ 3     plane←{                                 ⍝ Boxed rank-2 plane.              │
│ 3         2<⍴⍴⍺:⍺ join ⍵                      ⍝ gap-separated sub-planes.        │
│ 2         odec←(dec shape ⍺)outer ⍵           ⍝ outer type and shape decoration. │
│ 2         idec←inner ⍺                        ⍝ inner type and shape decorations.│
│ 2         (odec,idec)collect ⍵                ⍝ collected, formatted subarrays.  │
│ 1     }                                                                          │
│ 1                                                                                │
│ 1     join←{                                  ⍝ Join of gap-separated sub-planes.│
│ 1         sep←(≢⍵)÷1⌈≢⍺                       ⍝ sub plane separation.            │
│ 1         split←(0=sep|⍳≢⍵)⊂[0]⍵              ⍝ separation along first axis.     │
│ 1         (⊂⍤¯1⊢⍺)plane¨split                 ⍝ sub-plane join.                  │
│ 1     }                                                                          │
│ 1                                                                                │
│ 2     outer←{                                 ⍝ Outer decoration.                │
│ 2         sizes←1 0{⊃↓(⍉⍣⍺)⍵}¨sepr⍴¨⍵         ⍝ row and col sizes of subarrays.  │
│ 2         sides←sizes/¨¨'│─'                  ⍝ vert and horiz cell sides.       │
│ 2         bords←dec↓¨'├┬'glue¨sides           ⍝ joined up outer borders.         │
│ 2         ↑,¨/('┌' '')⍺ bords'└┐'             ⍝ vertical and horizontal borders. │
│ 1     }                                                                          │
│ 1                                                                                │
│ 2     inner←{                                 ⍝ Inner subarray decorations.      │
│26         deco←{(type ⍵),1 shape ⍵}           ⍝ type and shape decorators.       │
│ 2         sepr deco¨matr dec open ⍵           ⍝ decorators: tt vv hh .           │
│ 1     }                                                                          │
│ 1                                                                                │
│ 2     collect←{                               ⍝ Collected subarrays.             │
│ 2         lft top tt vv hh←⍺                  ⍝ array and subarray decorations.  │
│ 2         cells←vv right 1 open tt hh lower ⍵ ⍝ cells boxed right and below.     │
│ 2         boxes←(dec∨0∊⍴⍵)open cells          ⍝ opened to avoid ,/⍬ problem.     │
│ 2         lft,top⍪↑⍪⌿,/boxes                  ⍝ completed collection.            │
│ 1     }                                                                          │
│ 1                                                                                │
│ 2     right←{                                 ⍝ Border right each subarray.      │
│ 2         types←2⊥¨(⍳⍴⍵)=⊂¯1+⍴⍵               ⍝ right border lower corner types. │
│ 2         chars←'┼┤┴┘'[types]                 ⍝    ..     ..      ..      chars. │
│26         rgt←{⍵,(-≢⍵)↑(≢⍵)1 1/'│',⍺}         ⍝ form right border.               │
│ 2         ((matr 1 open ⍺),¨chars)rgt¨⍵       ⍝ cells bordered right.            │
│ 1     }                                                                          │
│ 1                                                                                │
│ 2     lower←{                                 ⍝ Border below each subarray.      │
│26         bot←{⍵⍪(-1⊃⍴⍵)↑⍺ split ⍵}           ⍝ lower border.                    │
│26         split←{((¯2+1⊃⍴⍵)/'─')glue ⍺}       ⍝ decorators split with horiz line.│
│ 2         (matr↑,¨/⍺)bot¨matr ⍵               ⍝ cells bordered below.            │
│ 1     }                                                                          │
│ 1                                                                                │
│24     type←{                                  ⍝ Type decoration char.            │
│24         dec<|≡⍵:'─'                         ⍝ nested: '─'                      │
│24         isor ⍵:'∇'                          ⍝ ⎕or:    '∇'                      │
│72         sst←{                               ⍝ simple scalar type.              │
│72             0=dec×⍴⍴⍵:'─'                   ⍝ undecorated or scalar ⍕⍵: char,  │
│72             (⊃⍵∊'¯',⎕D)⊃'#~'                ⍝ otherwise, number or space ref.  │
│24         }∘⍕                                 ⍝ ⍕ distinguishes type of scalar.  │
│24         0=≡⍵:sst ⍵                          ⍝ simple scalar: type.             │
│24         {(1=⍴⍵)⊃'+'⍵}∪,sst¨dec open ⍵       ⍝ array: mixed or uniform type.    │
│ 1     }                                                                          │
│ 1                                                                                │
│26     shape←{                                 ⍝ Row and column shape decorators. │
│26         dec≤0=⍴⍴⍵:⍺/¨'│─'                   ⍝ no decoration or scalar.         │
│26         cols←(ׯ1↑⍴⍵)⊃'⊖→'                  ⍝ zero or more cols.               │
│26         rsig←(××/¯1↓⍴⍵)⊃'⌽↓'                ⍝ zero or more rows.               │
│26         rows←(¯1+3⌊⍴⍴⍵)⊃'│'rsig'⍒'          ⍝ high rank decorator overrides.   │
│26         rows cols                           ⍝ shape decorators.                │
│ 1     }                                                                          │
│ 1                                                                                │
│10     matr←{↑,↓⍵}                             ⍝ matrix from non-scalar array.    │
│ 6     sepr←{+/¨1⊂↑⍵}                          ⍝ vec-of-mats from mat-of-vecs.    │
│83     open←{16::(1⌈⍴⍵)⍴⊂'[ref]' ⋄ (⍺⌈⍴⍵)⍴⍵}   ⍝ stretched to expose nulls.       │
│51     isor←{1 ⍬≡(≡⍵)(⍴⍵)}                     ⍝ is ⎕or of object?                │
│29     glue←{0=⍴⍵:⍵ ⋄ ↑⍺{⍺,⍺⍺,⍵}/⍵}            ⍝ ⍵ interspersed with ⍺s.          │
│ 1                                                                                │
│ 1     isor ⍵:⎕FMT⊂⍵                           ⍝ simple ⎕OR: done.                │
│ 1     1=≡,⍵:⎕FMT ⍵                            ⍝ simple array: done.              │
│ 1     box ⍵                                   ⍝ recursive boxing of array.       │
│ = }                                                                              │
└──────────────────────────────────────────────────────────────────────────────────┘

    osc¨(profile'osc')⍳10           ⍝ multiple applications of subject function
┌────────────────────────────────────────────────────────┐
│77 osc←{               ⍝ Oscillate - probably returns 1.│
│77     1=⍵:1                                            │
│67     2|⍵:∇ 1+3×⍵                                      │
│50         ∇ ⍵÷2                                        │
│ = }                                                    │
└────────────────────────────────────────────────────────┘

    osc←{
        1=⍵:⍵
        2|⍵:odd ⍵
        even ⍵
    }

    odd←{
        osc 1+3×⍵
    }

    even←{
        osc ⍵÷2
    }

    P ← profile'osc' 'odd' 'even'           ⍝ profiling operator

    osc¨P ⍳100                              ⍝ profile of three functions
┌──────────────────────┐
│3242 osc←{            │
│3242         1=⍵:⍵    │
│3142         2|⍵:odd ⍵│
│2137         even ⍵   │
│   =     }            │
├──────────────────────┤
│1005 odd←{            │
│1005         osc 1+3×⍵│
│   =     }            │
├──────────────────────┤
│2137 even←{           │
│2137         osc ⍵÷2  │
│   =     }            │
└──────────────────────┘

Back to: code

Back to: Workspaces