PrayBarBack to praybar.com

How PrayBar was measured

The numbers on praybar.com come from watching PrayBar's process while it sits in the menu bar. Here is how that was done, every run, the raw data, and what the numbers leave out.

PrayBar 1.0

Ten minutes on a MacBook Pro (M1 Pro, 16 GB) running macOS 15.6.1, with PrayBar 1.0 counting down and both notifications on. The menu and Settings stayed closed. This is the build you download.

Average CPU0.012% (72 ms of CPU time in ten minutes)
Readings at 0.0%109 of 120
Readings with no CPU at all76 of 120
Highest reading0.16%
Memory11.4–11.6 MiB
Disk writes0 bytes

Ten of the eleven non-zero readings came in the five seconds after a minute turned, when the countdown changes. The eleventh, at 7:27:21, wasn't on a minute, and its cause wasn't captured. Raw data (CSV).

How

A small sampler, profile-idle.c, asks macOS for PrayBar's process counters every five seconds, the same interval Activity Monitor uses by default. CPU comes from the change in total CPU time between readings, so short bursts between samples still count. As in Activity Monitor, 100% means one full CPU core, and readings are shown to one decimal place.

The sampler was checked against test programs with a known load. It agreed with the kernel's own accounting, as reported by ps, within ps's 0.01-second resolution: 1.69% against 1.72%, and 8.74% against 8.72%.

Every run used an optimized Release build, started outside Xcode. During the idle runs nothing else touched PrayBar, apart from the earliest clock run, where Instruments was also recording.

Every run

The other runs used pre-release builds from the day before 1.0. The earliest of them predate a small optimization to the once-a-minute countdown update. Memory is physical footprint, which is roughly what Activity Monitor's Memory column shows.

BuildModeConditionsAvg CPUAt 0.0%No CPUPeakMemory (MiB)Data
1.0CountdownIdle, 10 min0.012%109/12076/1200.16%11.4–11.6CSV
Pre-releaseCountdownIdle, fresh launch0.008%55/6041/600.10%9.1–9.3CSV
Pre-releaseCountdownIdle, fresh launch0.014%55/6041/600.19%9.0–9.2CSV
Pre-releaseClockIdle, fresh launch0.0001%60/6057/600.003%9.1CSV
EarlierCountdownIdle0.015%55/6039/600.20%9.3–9.5CSV
EarlierClockIdle, fresh launch0.0003%60/6057/600.015%8.7–8.8CSV
EarlierClockIdle, after Settings had been opened0.017%54/6042/600.40%29.7–33.5CSV
EarlierCountdownMenu opened once0.044%54/6041/601.8%12.5–13.7CSV
EarlierCountdownMenu and Settings opened0.19%50/6019/605.0%9.5–25.5CSV

The last two runs weren't idle, and they show what using PrayBar costs. Opening the menu peaks briefly at about 2%. Opening Settings loads SwiftUI, and macOS keeps that in memory after the window closes, so PrayBar settles at about 25–30 MiB instead of 9–12.

Each CSV has one row every five seconds: the time (UTC), total CPU seconds, CPU % for that interval, memory, wakeups and disk I/O. The first row is a baseline.

What these numbers don't cover

Run it yourself

With PrayBar running and its menu closed, from a clone of the repository:

xcrun clang -O2 scripts/profile-idle.c -o profile-idle
./profile-idle $(pgrep -x PrayBar) 300 > run.csv
python3 scripts/summarize-idle.py run.csv

The second argument is the length of the run in seconds.