NSGo

The same apps, five frameworks.

Three small apps, written for each framework the way it is meant to be used, built as releases and measured one after another on the same machine.

Counter

A count and two buttons, left idle: how fast an app opens and what it costs to keep it open.

StartupLower is better
  • NSGo285 ms
  • GPUI Kit292 ms
  • GPUI Fast309 ms
  • NSH324 ms
  • MyGo397 ms
MemoryLower is better
  • NSH21.3 MB
  • NSGo24.9 MB
  • MyGo31.9 MB
  • GPUI Kit36.7 MB
  • GPUI Fast37.1 MB
Binary sizeLower is better
  • NSGo7.9 MB
  • MyGo10.2 MB
  • GPUI Kit15.0 MB
  • GPUI Fast16.6 MB
  • NSH33.0 MB
StartupLower is better
  • NSGo161 ms
  • NSH161 ms
  • MyGo165 ms
  • GPUI Kit187 ms
  • GPUI Fast188 ms
MemoryLower is better
  • NSGo59.2 MB
  • NSH60.3 MB
  • GPUI Kit61.4 MB
  • MyGo62.7 MB
  • GPUI Fast63.5 MB
Binary sizeLower is better
  • NSGo8.4 MB
  • MyGo11.0 MB
  • GPUI Kit19.0 MB
  • GPUI Fast21.4 MB
  • NSH45.4 MB
StartupLower is better
  • NSGo81 ms
  • NSH90 ms
  • GPUI Kit96 ms
  • GPUI Fast97 ms
  • MyGo98 ms
MemoryLower is better
  • GPUI Kit39.2 MB
  • NSGo47.6 MB
  • NSH50.0 MB
  • GPUI Fast53.8 MB
  • MyGo70.5 MB
Binary sizeLower is better
  • NSGo7.9 MB
  • MyGo10.5 MB
  • GPUI Kit38.7 MB
  • NSH40.1 MB
  • GPUI Fast41.1 MB

Streaming quotes

A table of 40 quotes, ten of which change every display frame, four texts each.

CPULower is better
  • GPUI Fast61.4%
  • NSH66.2%
  • MyGo66.6%
  • GPUI Kit72.2%
  • NSGo75.8%

AppCompositor

Percent of one core. Native views leave their drawing to the system compositor, where a GPU renderer draws in its own process, so each bar adds the compositor’s CPU to the app’s.

MemoryLower is better
  • NSH36.7 MB
  • NSGo47.9 MB
  • GPUI Kit80.5 MB
  • MyGo84.6 MB
  • GPUI Fast85.1 MB
Frames per secondHigher is better
  • NSGo120
  • MyGo120
  • NSH120
  • GPUI Kit120
  • GPUI Fast120

Updates follow the display: an app that keeps up stays at its refresh rate.

CPULower is better
  • MyGo127.2%
  • GPUI Fast141.1%
  • NSH157.8%
  • GPUI Kit164.2%
  • NSGo175.6%

AppCompositor

Percent of one core. Native views leave their drawing to the system compositor, where a GPU renderer draws in its own process, so each bar adds the compositor’s CPU to the app’s.

MemoryLower is better
  • GPUI Kit67.2 MB
  • NSH68.3 MB
  • GPUI Fast71.1 MB
  • NSGo76.2 MB
  • MyGo87.8 MB
Frames per secondHigher is better
  • NSH260
  • GPUI Kit260
  • GPUI Fast260
  • NSGo260
  • MyGo259

Updates follow the display: an app that keeps up stays at its refresh rate.

CPULower is better
  • GPUI Fast15.1%
  • MyGo15.6%
  • NSH19.4%
  • GPUI Kit21.2%
  • NSGo24.0%

AppCompositor

Percent of one core. Native views leave their drawing to the system compositor, where a GPU renderer draws in its own process, so each bar adds the compositor’s CPU to the app’s.

MemoryLower is better
  • GPUI Kit54.8 MB
  • NSH55.5 MB
  • GPUI Fast59.3 MB
  • NSGo61.1 MB
  • MyGo93.3 MB
Frames per secondHigher is better
  • NSGo60
  • MyGo60
  • NSH60
  • GPUI Kit60
  • GPUI Fast60

Updates follow the display: an app that keeps up stays at its refresh rate.

Scrolling list

10,000 rows of a dot and two texts, scrolled a row further every display frame.

CPULower is better
  • NSH47.4%
  • GPUI Fast47.4%
  • NSGo52.3%
  • GPUI Kit53.7%
  • MyGo60.0%

AppCompositor

Percent of one core. Native views leave their drawing to the system compositor, where a GPU renderer draws in its own process, so each bar adds the compositor’s CPU to the app’s.

MemoryLower is better
  • NSH31.3 MB
  • NSGo42.0 MB
  • MyGo67.9 MB
  • GPUI Kit69.3 MB
  • GPUI Fast75.4 MB
Frames per secondHigher is better
  • NSGo120
  • MyGo120
  • NSH120
  • GPUI Kit120
  • GPUI Fast120

Updates follow the display: an app that keeps up stays at its refresh rate.

CPULower is better
  • MyGo134.7%
  • GPUI Fast137.4%
  • GPUI Kit137.7%
  • NSH148.7%
  • NSGo154.9%

AppCompositor

Percent of one core. Native views leave their drawing to the system compositor, where a GPU renderer draws in its own process, so each bar adds the compositor’s CPU to the app’s.

MemoryLower is better
  • GPUI Kit63.3 MB
  • NSH64.9 MB
  • GPUI Fast70.5 MB
  • NSGo71.5 MB
  • MyGo77.2 MB
Frames per secondHigher is better
  • NSGo260
  • NSH260
  • GPUI Kit260
  • GPUI Fast260
  • MyGo259

Updates follow the display: an app that keeps up stays at its refresh rate.

CPULower is better
  • GPUI Fast9.8%
  • GPUI Kit10.6%
  • NSH11.0%
  • MyGo11.2%
  • NSGo13.4%

AppCompositor

Percent of one core. Native views leave their drawing to the system compositor, where a GPU renderer draws in its own process, so each bar adds the compositor’s CPU to the app’s.

MemoryLower is better
  • NSH52.1 MB
  • GPUI Kit52.6 MB
  • NSGo56.0 MB
  • GPUI Fast58.6 MB
  • MyGo85.9 MB
Frames per secondHigher is better
  • NSGo61
  • MyGo60
  • NSH60
  • GPUI Kit60
  • GPUI Fast60

Updates follow the display: an app that keeps up stays at its refresh rate.

Measured on November 10, 2026 on Apple M1 Max with 34.36 GB of memory: the median of 3 runs, 10 s each.

Versions
NSGo 03896f1
MyGo v0.8.3
NSH 0.4.0
GPUI Kit gpui-kit 0.9.1, gpui-pre 0.3.12
GPUI Fast gpui-kit 0.9.1, gpui-fast 0.1.14

Measured on November 10, 2026 on Intel(R) Core(TM) Ultra 9 285K with 67.94 GB of memory: the median of 3 runs, 10 s each.

Versions
NSGo 03896f1
MyGo v0.8.3
NSH 0.4.0
GPUI Kit gpui-kit 0.9.1, gpui-pre 0.3.12
GPUI Fast gpui-kit 0.9.1, gpui-fast 0.1.14

Measured on November 10, 2026 on AMD Ryzen 9 6900HX with Radeon Graphics with 31.25 GB of memory: the median of 3 runs, 10 s each.

Versions
NSGo 03896f1
MyGo v0.8.3
NSH 0.4.0
GPUI Kit gpui-kit 0.9.1, gpui-pre 0.3.12
GPUI Fast gpui-kit 0.9.1, gpui-fast 0.1.14

Where each one runs.

NSGoMyGoNSHGPUI KitGPUI Fast
Building apps
LanguageGo, TSXGoRust, TSXRustRust
Drawn withNative viewsIts own GPU rendererNative viewsGPUI on the GPUGPUI on the GPU, retained
Hot reload——
Screens loaded at run time, signed———
Desktop
macOS
Windows
Linux
Beyond the desktop
Web
iOS———
Android———
HarmonyOS————
App Clips————
tvOS————
watchOS————
Home screen widgets————
Mini programs
WeChat———
QQ————
Alipay————
Douyin————

How it is measured.

  • Each app prints a line on its first frame, then every second how many frames it updated. The runner times the first line from the start and reads the process’s CPU time and memory from the system.
  • Startup runs from launching the binary to the first frame. Memory is read at the end of a run: the physical footprint on macOS, the proportional set size on Linux, the working set on Windows.
  • CPU is measured for 10 seconds after 3 to settle, the apps taking turns. The compositor is WindowServer on macOS, the Desktop Window Manager on Windows, and the Wayland compositor and Xwayland on Linux, less what it spends with none of the apps open.
  • Release builds: go build -ldflags "-s -w", and cargo build --release with symbols stripped. GPUI Kit and GPUI Fast share one source, built against upstream GPUI and against GPUI Fast.