Skip to content

Optimize rendered sample buffering in audio output path#1

Open
Solvely-Colin wants to merge 1 commit into
mainfrom
solvely-colin/perf-improvements-pr
Open

Optimize rendered sample buffering in audio output path#1
Solvely-Colin wants to merge 1 commit into
mainfrom
solvely-colin/perf-improvements-pr

Conversation

@Solvely-Colin

Copy link
Copy Markdown
Owner

Summary

  • replace RenderedSampleBuffer's front-removal queue operations with an offset-based queue
  • compact backing storage periodically instead of shifting on every dequeue/overflow trim
  • add tests covering FIFO dequeue order and bounded-capacity dropping behavior

Why

emoveFirst(...) on Array is O(n) and was used in the render-adjacent buffering path. This change avoids repeated full-array shifts in steady-state callback traffic.

Testing

  • Added RenderedSampleBufferTests for queue ordering and capacity trimming
  • Could not run swift test in this environment because the Swift toolchain is unavailable (swift command not found).

Replace front-removal dequeue operations in RenderedSampleBuffer with an offset-based queue and periodic compaction to avoid O(n) work on every audio callback-driven dequeue/enqueue path. Add focused tests for FIFO behavior and bounded-capacity trimming.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings June 7, 2026 04:36

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR optimizes the RenderedSampleBuffer used in the audio output path by replacing Array.removeFirst(...)-based dequeuing/trimming (O(n) per operation) with an offset-based queue and periodic compaction, reducing steady-state work in render-adjacent code. It also adds unit tests to validate FIFO ordering and bounded-capacity drop behavior.

Changes:

  • Track a readOffset into the backing [Float] array to avoid front-removal shifts on every dequeue/trim.
  • Periodically compact backing storage (and reset when empty) instead of shifting on each operation.
  • Add RenderedSampleBuffer tests for dequeue ordering and capacity trimming.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.

File Description
Sources/OpenFaderCore/AudioRenderLoop.swift Reworks RenderedSampleBuffer to use an offset-based queue with periodic compaction to avoid O(n) removeFirst shifting.
Tests/OpenFaderCoreTests/RenderedSampleBufferTests.swift Adds tests for FIFO dequeue order and dropping oldest samples when exceeding maximum capacity.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +369 to +372
private func compactStorageIfNeeded() {
guard readOffset > 0,
readOffset >= 4096,
readOffset * 2 >= samples.count else {
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants