rslt ← {larg} (func ##.profile subs) rarg ⍝ Performance profiling. [profile] applies its [func]tion operand and, as a side-effect, displays the source lines of the [sub]ject function(s) preceded by two columns of performance information: hits: number of times the line in the subject function was visited time: percentage of total time spent in the line of the subject function The last row of the output shows an '=' followed by the total percentage of time spent in the function as a whole. 123 11 func←{ 123 14 ⍵<0:⍺ 54 10 sum←⍺+⍵ 54 ⍝ 54 8 sum×2 = 43 } ──── total time percentage for this function │ │ └───── function source │ └─────── time percentages column └────────── line-visits column In common with the →time← operator, the display of profile's subject function(s) is a side-effect of the application of its left operand function. This means that a derived monadic operator (profile'sub1' 'sub2' ...) can be injected into an expression anywhere between a function and its right argument. [A dyadic operator such as profile can be bound with a right operand to derive a monadic operator. This is sometimes referred to as "right operand currying"]. [profile] supersedes [mdf] and [ticks]. Examples: 210 gcd (profile'gcd') 330 ⍝ profile of →gcd← function 6 25 gcd←{ ⍝ Greatest common divisor. 6 34 ⍵=0:|⍺ 5 41 ⍵ ∇ ⍵|⍺ = 100 } osc←{ ⍝ →osc← or "snowflake" function 1=⍵:⍵ 2|⍵:odd ⍵ even ⍵ } odd←{ ⍝ odd case osc 1+3×⍵ } even←{ ⍝ even case osc ⍵÷2 } P ← profile'osc' 'odd' 'even' ⍝ derived profiling operator osc¨P ⍳100 ⍝ profile of three functions 3242 9 osc←{ 3242 13 1=⍵:⍵ 3142 17 2|⍵:odd ⍵ 2137 18 even ⍵ = 57 } 1005 3 odd←{ 1005 11 osc 1+3×⍵ = 14 } 2137 6 even←{ 2137 23 osc ⍵÷2 = 29 } See also: cmpx time cf Back to: contents Back to: Workspaces