Mac Studio, 50,000 messages
Mac Studio (Apple M1 Ultra), macOS 15.460 Hz display50,000-message mailboxOctober 14, 2026
Submitted by @wes, who works on Spool. Imported from where it was first published; raw output not yet in the repository.
Same machine: 250,000 messages
Open a message
Click a message in the list until the reader has finished drawing it.
- Spool55 ms (best)
- Thunderbird◐ (partial mailbox)56 ms (best)
- Apple Mail73 ms
- MailMate150 ms
- Mailflare◐ (partial mailbox)1151 ms
- Canary Mail181 ms
2 clients are within one frame (17 ms) of the lowest, closer than the instrument can tell apart, so all of them are marked best.
- 1Mailflare. Opening a message downloads its body from the server the first time, where the other clients already have it.
Next message
Press ↓ until the next message has finished drawing.
- Spool55 ms (best)
- Apple Mail77 ms
- Canary Mail181 ms
- Mailflare◐ (partial mailbox)273 ms
- Thunderbird◐ (partial mailbox)305 ms
- MailMate423 ms
Search
Type a word into the search field until the results have finished drawing. Typing it is part of the time, about 80 ms.
- Spool61 ms (best)
- Apple Mail1120 ms
- MailMate2185 ms
- Thunderbird◐ (partial mailbox)3372 ms
- Mailflare◐ (partial mailbox)4428 ms
- Canary Mail519 ms
- 1Apple Mail. Apple Mail searches through Spotlight. The time is what a person waits for, not a comparison of search engines.
- 2MailMate. MailMate searches when Return is pressed, not as you type, so its time includes the Return.
- 3Thunderbird. The Quick Filter, Thunderbird's search-as-you-type, looks at sender, recipients and subject by default but not the message body, which is less work than full-text search.
- 4Mailflare. Searches subject, sender and preview in the messages it has downloaded, never the full text or the server, and waits 200 ms after a keystroke before it starts.
Launch
Open the app until the inbox is on screen and has stopped changing. Warm: the app has run before and its files are cached.
- Spool282 ms (best)
- Mailflare◐ (partial mailbox)521 ms
- Canary Mail1,620 ms
- Apple Mail1,691 ms
- MailMate1,909 ms
- Thunderbird◐ (partial mailbox)2,171 ms
Quit
Ask the app to quit, as the menu item does, until its process has exited. The process is checked every 2 ms.
- Spool28 ms (best)
- Canary Mail44 ms
- Mailflare◐ (partial mailbox)48 ms
- Thunderbird◐ (partial mailbox)97 ms
- MailMate196 ms
- Apple Mail218 ms
Scroll
Thirty notches of the scroll wheel until the list stops moving. Posting the thirty notches takes about 240 ms of it.
- Canary Mail305 ms (best)
- Apple Mail306 ms (best)
- MailMate319 ms (best)
- Mailflare◐ (partial mailbox)321 ms (best)
- Spool324 ms
- Thunderbird◐ (partial mailbox)571 ms
4 clients are within one frame (17 ms) of the lowest, closer than the instrument can tell apart, so all of them are marked best.
Memory
Physical footprint after the tests, as Activity Monitor counts it, including the helper processes macOS charges to the app (WebKit, GPU, networking).
- Spool144 MB (best)
- Mailflare◐ (partial mailbox)158 MB
- MailMate219 MB
- Apple Mail260 MB
- Canary Mail407 MB
- Thunderbird◐ (partial mailbox)1,148 MB
Idle CPU
Share of one core used over ten seconds of the app sitting idle after the tests.
- MailMate0.2% (best)
- Spool1.1%
- Apple Mail1.7%
- Canary Mail2.1%
- Mailflare◐ (partial mailbox)13.4%
- Thunderbird◐ (partial mailbox)4.1%
- 1Mailflare. Includes re-checking the newest 50 messages in every folder once a minute.
Every number
Medians. For a test timed from the screen, the number is when the window stopped changing, and “first” beneath it is when it started to. Quit is timed to the process exiting.
| Test | Apple Mail16.0 | Canary Mail5.26 | Mailflare◐1.6 | MailMate1.13.2 | Spool0.1.11 | Thunderbird◐144 |
|---|---|---|---|---|---|---|
| Open a message | 73 ms | 181 ms | 151 ms | 150 ms | 55 ms (best) | 56 ms (best) |
| Next message | 77 ms | 181 ms | 273 ms | 423 ms | 55 ms (best) | 305 ms |
| Search | 120 ms | 519 ms | 428 ms | 185 ms | 61 ms (best) | 372 ms |
| Launch | 1,691 ms | 1,620 ms | 521 ms | 1,909 ms | 282 ms (best) | 2,171 ms |
| Quit | 218 ms | 44 ms | 48 ms | 196 ms | 28 ms (best) | 97 ms |
| Scroll | 306 ms (best) | 305 ms (best) | 321 ms (best) | 319 ms (best) | 324 ms | 571 ms |
| Memory | 260 MB | 407 MB | 158 MB | 219 MB | 144 MB (best) | 1,148 MB |
| Idle CPU | 1.7% | 2.1% | 3.4% | 0.2% (best) | 1.1% | 4.1% |
| First syncnot ranked | — | — | — | — | 8.0 sits own count | — |
Notes on this run
- Mailflare held 300 messages, the newest 50 in each of six folders. Mailflare fetches only the newest 50 messages in each folder, and older mail as the list is scrolled. The other clients held all 50,000.
- Thunderbird held about 95% (everything but Junk and Trash). Thunderbird keeps no offline copy of Junk and Trash by default. The rest of the mailbox it held in full.
- Mailflare was measured later. On 30 October, on the same machine and the same server; the other five on 14 October.
The setup
The instrument on this machine
The instrument adds about 28 ms to every time it reads off this machine's screen; the fastest anything can measure here is around 45 ms. The same for every client, so it cancels in a comparison. As published with these results: one or two frames of the 60 Hz display, plus capture. The raw calibration was not kept with them.
- Mailbox
- 50,000 messages, corpus spool-bench-2026-10 — not checked against a published digestThe generator this repository started from, before it was made deterministic: the same messages, folders and seed as mailbench-v1, but dated from the day it was generated and with Spool-named MIME boundaries and one header. Close to mailbench-v1, and still a different mailbox: runs on the two do not go in one table.
- Machine
- Mac Studio, Apple M1 Ultra, on mains power
- Display
- 1920 × 1080 at 60 Hz
- Window
- 1400x900 points, the same for every client
- Runs
- 20 per test (10 for scroll, 5 for launch and quit, after one unrecorded launch)
- Search term
- postmortem
- Harness
- spool/bench, October 2026 (before it moved here)
- Raw output
- Not in the repository yet. Transcribed from Spool's benchmark page, where these runs were first published. The raw harness output is on the machine that measured them and has not been added to this repository yet; until it is, these are the only numbers here that CI cannot regenerate from the instrument's own lines. Where it was first published.
See a problem with this run? Open an issue about it.