Performance Improvements

As part of the ongoing Performance Quality Assurance project , Version 15.0 includes a number of performance improvements as summarised in the following table.

Expression Factor Comments
↑x 5-12 for elements with the same rank and same shape with possible exception of leading axis
↓x 1-1.75 AKA ⊂⍤1⊢x
⊂⍤r⊢x 1-1.75 AKA ⊂[(-r)↑⍳⍴⍴x]x
↓[a]x 1.5-5
⍕b 1-40
⍕int8 1-10
x⍕b 1-300 for x having 1 or 2 elements
x⍕int8 1-180 for x having 2 elements, the first of which is non-zero
b∘.f x 1-8
b⊥b 3-∞ equivalent to +/∧\⌽b, the number of trailing 1s in b
b(≢¨⊂)x TBA partition pseudo operator
b(f/¨⊂)x TBA partition pseudo operator, for f one of + × ⌈ ⌊ ∧ ∨ ≠ =
>/b
≥/b
⍱/b
⍲/b
</b
≤/b
1800-87e3
∧/b
∨/b
1-∞
+/b 1-8
,/y 1-∞ for arguments with arrays with rank > 1
2 f/ x 1.2-4 for vector x and f one of + - × ⌈ ⌊ = ≠ < ≤ ≥ = ∨ ∧ ⍲ ⍱
n,/[a]x 1-50 for simple array x
n+/[a]x
n≠/[a]b
n=/[a]b
TBA
n⌈/[a]x
n⌊/[a]x
TBA
x∘.,y 2-4
∧.∧
∨.∨
5-∞ for boolean vector arguments
x⍳⍤1 0⊢y 13
x⌷⍤r⊢y 1-370 where the effective left rank is 0
b[;…;i]
b[i]
1-4 boolean column indexing and boolean vector indexing
x[i;…;] 2-18 row (major cell) indexing AKA (⊂i)⌷xAKA i⌷⍤0 15⊢x
+z,
-z
y+z
y-z
○z
1-6 complex arguments; greatest speed-ups are only on Linux
x≡y
x≢y
1-8.7 64-bit floats or complex arguments
x≡y
x≢y
1-1.4 non float simple arguments
x⊥y 1-26 special case for scalar or vector x
x⊤y 1-3.3 special case for integer vector x and integer y
f\[a]x 2-20 f is + × (deferred from 14.0)
-\[a]x
÷\[a]x
1-∞
⍺⍕⍵
⍺ ⎕FMT ⍵
varies E F and I formats, non-DECF data
⍋p 10-50 for permutations
⍒p 10-50 for permutations
⍋⍵
⍒⍵
1-1.7 result in smallest datatype
⍋⍵
⍒⍵
2-20 for small-range arguments
÷⍵ 1-1.1 for non .NET systems only
≡⍵ 2-∞
{⍺,f⌿⍵}⌸
{⍺(f⌿⍵)}⌸
TBA for f one of + ⌈ ⌊ = ≠ ∨ ∧
x*b 1-90 scalar x and boolean b
f⍤r 1-1.5 general case of rank operator on small arguments
f⌸ 1-1.8 general case of key operator on small arguments and/or in monadic case
f.g 1-1.6 general case of inner product
f is any monadic or dyadic scalar function
≢¨⍵ 25
f/¨⍵ 1-16 f one of + ⌈ ⌊ ∧ ∨ = ≠
⍺+.×⍵ 1-11 boolean vector ⍺ and boolean array ⍵; also +.∧
⍺+.f ⍵ 4 boolean array ⍺ and boolean vec , for f one of × ∧ > < ≠ ∨ ⍱ = ≥ ≤ ⍲
⌈/⍵
⌊/⍵
1-29 for non-vector
+/x 6-35 for integer x
0∊b
1∊b
1-400
⌽[a]x 1-3.7
⍋b
{⍵[⍋⍵;]}b
1-7 also instead of ; for boolean b with a multiple of 8 columns
⍋b
{⍵[⍋⍵;]}b
1-5 also instead of ; for boolean b with 1-element major cells
⍋b
{⍵[⍋⍵;]}b
5-27 also instead of ; for boolean b with NOT a multiple of 8 columns
?m⍴n 1.1-1.4 result is smallest datatype based on n >
x∧.=1 1-100 also 1∧.=x, x∨.≠1, 1∨.≠x; also 0 instead of 1
⍉bm 1.2 POWER8 only, transposing a matrix with multiple of 8 rows and columns
y∊x 3-17 where x and/or y have 1- or 2-byte items
y~x 3-12 where x and/or y have 1- or 2-byte items
y∩x 3-12 where x and/or y have 1- or 2-byte items
x∪y 3-13 where x and/or y have 1- or 2-byte items
∪x 3-16 where x has 1- or 2-byte items

New Idiom

The following new idiom is recognised:

Expression Description
XA↓⍨←NS This idiom applies only when NS is negative, when it removes the last -NS items from XA along its leading axis. For example, if NS is ¯3 then the idiom removes the last -¯3 (i.e. 3) items.