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¨ | 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 |

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. |