agentsclimarketplace

Audio performance debug

Skill kunitoki/sonic-skills/skills/audio-performance-debug

Modular Markdown-based audio skills for AI agents and developers, covering signal processing, synthesis, effects, analysis, and spatial audio.

Install
npx -y skills add kunitoki/sonic-skills --skill audio-performance-debug

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 14 stars14 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

Profiling strategy for audio CPU issues — xruns, spikes, and buffer underruns. Use when the user reports CPU overload, audio glitches under load, or performance regressions. Trigger on phrases like "I'm getting xruns", "my plugin causes CPU spikes", "dropouts under high voice count", "audio thread is too slow", "how do I profile my DSP". References audio-numerics-review for denormal slowdown and audio-dsp-review for lock contention.

SKILL.md

4.4 KB, as published. Nobody here has run it

Audio Performance Debug

Audio performance requires good worst-case complexity, not average-case — the audio thread fires on a hard deadline every buffer, regardless of what else is happening.

Step 1 — Identify the symptom

Measure before guessing. Different symptoms point to different root causes.

SymptomMeasurement approach
Consistent high CPU averageCPU meter in DAW; perf stat / Instruments Time Profiler
Sporadic xruns / dropoutsHost xrun log; correlate with system events (GC, network, page fault)
CPU spikes on note-onProfile with many simultaneous note-on events; watch for allocation spikes
Latency reporting wrongLog getLatencySamples() before and after prepareToPlay at varying buffer sizes
Gets worse with more voicesProfile with 1 vs 8 vs 32 voices; O(N²) shows quadratic growth
Memory bandwidth pressureperf mem / VTune memory bandwidth counter; cache miss rate

Step 2 — Locate the hotspot

  • Build a release (optimized) binary before profiling — debug builds are not representative.
  • Use a reproducible test case: fixed buffer size, fixed voice count, looped audio.
  • Attach a profiler to the audio thread specifically, not the whole process.
  • Identify the top-3 hottest functions by exclusive CPU time, not inclusive.
  • Check whether the spike is periodic (every N buffers → container rehash or GC) or random (OS jitter, page fault).
PlatformProfilerNotes
macOSInstruments — Time ProfilerFilter to audio I/O thread; use "hide system libraries" to focus on your code
macOSInstruments — AllocationsCatch allocations on the audio thread during a session
Linuxperf record -g + perf report--call-graph dwarf for C++ templates; perf stat for cache miss ratio
WindowsVTune Profiler — HotspotsUse "Platform Profiler" preset; filter to realtime thread
Cross-platformTracyFrame-level instrumentation; zero-cost when disabled; shows per-buffer timing
JUCEjuce::PerformanceCounterInline timer around suspect blocks; logs to console

Step 3 — Fix patterns

Anti-patternWhy it hurtsOptimization
O(N²) voice loopQuadratic growth — 32 voices = 1024 iterations per sampleRestructure to O(N): batch per-voice work, use SIMD across voices
Wrong FFT sizePower-of-two FFT on non-power-of-two frames → zero-padding wasteSize FFT to next power-of-two; or use prime-factor FFT (FFTW FFTW_MEASURE)
Unnecessary buffer copymemcpy of full buffer each callbackProcess in-place; pass pointer + length; avoid intermediate staging buffers
std::map / unordered_map lookup on audio threadO(log N) / amortized O(1) but with cache misses; unordered_map rehash = allocReplace with std::array + index, or a sorted std::array with lower_bound
unordered_map insertTriggers rehash → heap allocation on audio threadPre-populate at prepareToPlay; never insert during playback
Heap allocation on audio threadnew/delete acquires global allocator lockPre-allocate in prepareToPlay; use pool or ring buffer; see audio-dsp-review
First-touch page faultOS maps physical pages on first write → stallprepareToPlay: allocate AND write to every byte of every buffer
Scalar loop over samplesCompiler may not auto-vectorize complex loopsUse JUCE FloatVectorOperations, xsimd, or explicit SIMD intrinsics
Denormal-induced slowdownSubnormal FP values cause 100× slowdown on x86Set FTZ+DAZ in prepareToPlay; see audio-numerics-review
Lock contentionMutex held by UI thread blocks audio threadReplace with atomics or SPSC queue; see audio-dsp-review

For anti-pattern code examples and platform profiler workflows see references/performance-patterns.md.

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.