Performance

How long Grinch takes to decide where a link goes, and how much memory it uses. The routing workloads can be run on your Mac.

Method

Release builds on an Apple M4 Max with Rust 1.95.0, median of ten runs (November 2026). The benchmarks measure URL routing only, not launching the browser or loading the page.

Run bench/run.sh to reproduce them. The workloads are in bench/configs/; setup and full results are in the benchmark notes. To time your own config, run Grinch --bench N <url>. Grinch --bench-init N measures config loading.

Declarative rules

Hostname, domain(), regex, and wildcard matchers run as native code and never call into JavaScript. When no rewrite fires, Grinch works on the original URL string without copying it.

Workloadns per URL
Floor: no rules, no rewrite6.7
Default fallback, no query73.8
Default fallback, strip removes a parameter185.3
Bare-hostname match ("github.com")39.9
domain() match47.1
Regex match25.5
Wildcard match ("zoom.us/j/*")40.5
50 bare-hostname rules, the last one matches253.7

Function rules

Your own (url, ctx) => … matchers and rewrites run in JavaScriptCore. Functions that declare a second parameter also request the context object with the opener and modifier keys. Use them when a declarative matcher or rewrite can't express the rule. "URL only" means the function takes just the URL.

Workloadns per URL
A native rule matches first; no function runs40.5
Drop the URL with () => null (URL only)2,674.5
HTTP to HTTPS by changing the URL (URL only)4,423.7
?browser= dynamic open function (URL-only matcher)4,328.7
4 function matchers reading ctx.opener5,032.2
Full Slack web to slack:// rewrite4,919.3

Footprint

These are historical measurements, not a comparison of the latest releases. Memory use varies with configuration and workload.

GrinchFinchFinicky
Resident memory15.5 MB14.6 MB142.5 MB
Peak memory16.6 MB15.5 MB391.2 MB
JavaScript engineSystem JavaScriptCoreSystem JavaScriptCoreBundled goja
InterfaceMenu bar; a window when the icon is hiddenMenu barWebView config app

Finicky bundles a WebKit instance for its config window, which accounts for most of its memory use.