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.
| Workload | ns per URL |
|---|---|
| Floor: no rules, no rewrite | 6.7 |
| Default fallback, no query | 73.8 |
Default fallback, strip removes a parameter | 185.3 |
Bare-hostname match ("github.com") | 39.9 |
domain() match | 47.1 |
| Regex match | 25.5 |
Wildcard match ("zoom.us/j/*") | 40.5 |
| 50 bare-hostname rules, the last one matches | 253.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.
| Workload | ns per URL |
|---|---|
| A native rule matches first; no function runs | 40.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.opener | 5,032.2 |
Full Slack web to slack:// rewrite | 4,919.3 |
Footprint
These are historical measurements, not a comparison of the latest releases. Memory use varies with configuration and workload.
| Grinch | Finch | Finicky | |
|---|---|---|---|
| Resident memory | 15.5 MB | 14.6 MB | 142.5 MB |
| Peak memory | 16.6 MB | 15.5 MB | 391.2 MB |
| JavaScript engine | System JavaScriptCore | System JavaScriptCore | Bundled goja |
| Interface | Menu bar; a window when the icon is hidden | Menu bar | WebView config app |
Finicky bundles a WebKit instance for its config window, which accounts for most of its memory use.