Skip to content

Performance

Applies to nori 0.6. The model is the same on every client; the measurements are Android’s.

Measured October 14, 2026, on one Android 16 ARM64 emulator with four virtual cores and 2.5 GiB RAM, hosted on an Apple M4 Pro running macOS 26.6.2. All four apps use the same isolated Navidrome 0.64.0 server, 97-song library, and playlist. Builds: nori 0.6.0-beta.5, Symfonium 15.1.0, Musly 2.0.2, and Navic v1.0.0-alpha59.

The input contains real-music excerpts from the existing background-test corpus. Two five-minute passes cover MP3 at 44.1 and 48 kHz, plus FLAC at 44.1, 48, and 96 kHz. The FLAC variants are derived from MP3 sources to exercise decoding and resampling; they are not original high-resolution masters. Every format was observed playing in both passes for every app. Short clips change tracks every minute; uninterrupted album playback can have different costs.

MetricnoriSymfoniumMuslyNavic
App CPU0.81%7.89%3.91%4.28%
App + Android audio/codec CPU1.55%8.64%5.93%6.08%
Observed quiet app intervals268 / 3000 / 3000 / 3000 / 300
Observed voluntary app thread switches / second32.681037.29326.46254.5
Cold activity launch, median of five182 ms219 ms561 ms314 ms

CPU is a percentage of one virtual core. Process counters include work by threads that exit between samples. The combined row adds audioserver, media.swcodec, and media.extractor; it is not whole-device CPU. Quiet intervals and observed thread switches concern app threads only and do not measure CPU sleep residency or complete device wakeups. The screen is off and music volume is zero. Cold launches measure the first activity frame, with library and filesystem caches warm.

nori uses its optimized, minified perf APK with recording disabled. Symfonium and Navic use official release APKs. Musly is the documented release build with its emulator startup guard removed and playback code unchanged. APK hashes, source-file hashes, every playback window, all five launches, MediaSession checks, and compressed counters are in the raw music report.

These are emulator measurements, not phone battery-life figures. The earlier generated-tone report remains archived; it uses a different input and CPU accounting method and is not combined with these results.

Most players decode a little audio, hand it to the speaker, and wake again a few milliseconds later. nori decodes a stretch of music ahead instead, then lets the CPU sleep until that stretch is nearly played.

  • On Android the player writes into a deep AudioTrack buffer, about ten seconds of music. The player’s thread and the track’s writer both wake about once every ten seconds while music plays, and nothing on the audio path wakes in between.
  • With nothing that needs the samples (no equalizer, no speed change, no AutoMix), songs can go to the phone’s audio chip as they are: offload. The CPU then sleeps for minutes between top-ups. See Offload and processing.
  • Nothing polls or ticks while music plays with the screen off. The seek bar’s timer runs only while the player is on screen.
  • An optional feature that is switched off costs nothing: it is not started, holds no listener and opens no connection.

The comparisons below were made on one Android emulator (sdk_gphone64_x86_64, Android 14) against one local Navidrome server, with the same tracks for every app, media volume at 0, the screen off and no touches. nori was the release build; the other apps were their store releases.

  • CPU is the share of one core the app used.
  • Quiet seconds approximate background inactivity using thread context-switch counters; they do not measure physical CPU sleep residency.
  • Playback rows are 90-second windows over a 10-minute MP3 at 320 kbps and a FLAC; the equalizer row adds a treble boost in each app that has one.
  • An emulator has no real battery and decodes in software, so the absolute numbers do not carry over to a phone. The order between apps on physical hardware can also differ.

The perf build measures a real phone in real use, without a computer attached: see Building.

Measured on nori 0.3.1noriSymfonium 15.0.1Musly 2.0.2Navic alpha55
CPU playing MP31.26 %10.7 %4.01 %3.10 %
CPU playing FLAC1.30 %8.74 %4.70 %3.72 %
CPU playing with the equalizer1.35 %13.4 %no equalizer2.92 %
Quiet seconds, MP375 of 901 of 900 of 901 of 90
Cold startabout 590 msabout 900 msabout 1050 msabout 700 ms
Wake lock while pausednonenoneheldnone

Musly has no equalizer, and Navic has no transitions, so those rows compare features as much as cost.