Skip to content

Performance

What a Space switch costs KiwiDesk, measured the same way for every release that changes it so the rows compare. This page holds the newest comparison; earlier ones are linked at their release’s tag. Counts — accessibility calls, windows parked — come from the desk and move little with load; times are one machine’s and carry its noise, so compare them only within a table.

  • The desk. A fixed set of windows on one screen, one layout per Space: 3 TextEdit in bsp, 2 TextEdit and 2 VS Code in scrolling (two columns scrolled out), and Script Editor: 2 floating, 3 in stack and 3 in monocle. The config is a Lua file every release reads, with every animation setting both releases share pinned to its default.
  • The run. Ten round trips between two Spaces (20 switches), each pair measured idle, with every core busy, and with the GPU held at 90 %+ by a WebGL shader. Each cell is the mean of at least two runs; a maximum is the median of the runs’ maxima.
  • The machine. Apple M1 Max, one screen. Each comparison names the macOS version it ran on.

The procedure and the desk script live in the repository’s measure-work skill.

ColumnMeaning
AX callsAccessibility calls to other apps per switch
ParksWindows moved to the hiding corner per switch
Retile mean / maxMain-thread time of one layout pass, ms

Measured 2026-10-17 on macOS 27.0.1, 1.5 s between switches. 2.3.1 is the release tag (a35587d8c); 3.0.0 is e58659479 on its release branch. 3.0.0 has no Space-switch animation and no Monocle flip, so it is measured once and compared twice: against 2.3.1 with both of those off, and against 2.3.1 as it ships, with its 300 ms plate slide and the flip on.

Each cell reads 2.3.1 → 3.0.0.

2.3.1 with its switch animation and Monocle flip off

PairLoadAX callsParksRetile meanRetile max
bsp ↔ scrollingidle152 → 16610.4 → 9.910 → 1040 → 36
bsp ↔ scrollingCPU153 → 16410.1 → 10.18 → 826 → 32
bsp ↔ scrollingGPU154 → 16610.9 → 10.98 → 1045 → 173
scrolling ↔ floatingidle185 → 1857.9 → 7.810 → 1136 → 48
scrolling ↔ floatingCPU186 → 1857.9 → 7.88 → 933 → 28
scrolling ↔ floatingGPU186 → 1869.0 → 8.816 → 20289 → 229
stack ↔ monocleidle112 → 1127.4 → 7.410 → 1135 → 27
stack ↔ monocleCPU112 → 1127.5 → 7.48 → 826 → 23
stack ↔ monocleGPU112 → 1137.3 → 7.516 → 12261 → 172

2.3.1 as it ships

PairLoadAX callsParksRetile meanRetile max
bsp ↔ scrollingidle159 → 16610.2 → 9.99 → 1030 → 36
bsp ↔ scrollingCPU159 → 1649.9 → 10.18 → 828 → 32
bsp ↔ scrollingGPU158 → 16610.0 → 10.912 → 10300 → 173
scrolling ↔ floatingidle182 → 1858.2 → 7.810 → 1136 → 48
scrolling ↔ floatingCPU179 → 1858.2 → 7.89 → 933 → 28
scrolling ↔ floatingGPU181 → 1868.8 → 8.838 → 20376 → 229
stack ↔ monocleidle108 → 1126.8 → 7.410 → 1124 → 27
stack ↔ monocleCPU108 → 1126.8 → 7.49 → 828 → 23
stack ↔ monocleGPU109 → 1136.7 → 7.510 → 12139 → 172

The two releases do the same work per switch: within a few accessibility calls and parked windows on every pair, with bsp ↔ scrolling up to 9 % more calls in 3.0.0, and the same average layout pass. Those extra calls run off the main thread: calls on it fall from about 50 to 40 per 20 switches, and their time from 55 to 31 ms. Which change added them is not yet attributed; it predates 2732a681d. Against 2.3.1 as it ships, 3.0.0 is lighter under a saturated GPU on the pair with floating windows, where 2.3.1’s slide roughly doubled the average pass. The longest passes under that load vary by tens of milliseconds between runs of one build, so their differences are noise.

Each release’s page keeps its own comparison; read it at that release’s tag:

© 2026 KiwiCanopy