..
Some checks failed
CI / test-python (push) Failing after 17m23s
CI / test-typescript (push) Failing after 5m59s
CI / test-rust (push) Failing after 6m57s

This commit is contained in:
2026-01-24 19:27:58 +00:00
parent 011180b330
commit f68101896f

View File

@@ -6,10 +6,18 @@ to establish baselines and detect regressions.
Run with: pytest tests/benchmarks/ --benchmark-enable
Compare: pytest tests/benchmarks/ --benchmark-compare
Save baseline: pytest tests/benchmarks/ --benchmark-save=baseline
Note: These tests are marked as slow and excluded from CI unit test runs.
Run explicitly with: pytest tests/benchmarks/ -m slow
"""
from __future__ import annotations
import pytest
# Mark all tests in this module as slow (excluded from CI unit tests)
pytestmark = pytest.mark.slow
import numpy as np
import pytest
from typing import TYPE_CHECKING
@@ -70,7 +78,9 @@ def typed_benchmark[T](
return cast(T, _run_benchmark(benchmark, func, *args))
def benchmark_array(benchmark: BenchmarkFixture, func: object, *args: object) -> NDArray[np.float32]:
def benchmark_array(
benchmark: BenchmarkFixture, func: object, *args: object
) -> NDArray[np.float32]:
"""Run benchmark for functions returning float32 arrays.
BenchmarkFixture.__call__ is untyped. This wrapper returns a properly typed NDArray.
@@ -117,9 +127,7 @@ def benchmark_array_list(
return cast(list[NDArray[np.float32]], _run_benchmark(benchmark, func, *args))
def benchmark_float_list(
benchmark: BenchmarkFixture, func: object, *args: object
) -> list[float]:
def benchmark_float_list(benchmark: BenchmarkFixture, func: object, *args: object) -> list[float]:
"""Run benchmark for functions returning list of floats."""
from typing import cast
@@ -326,7 +334,10 @@ class TestVadBenchmark:
assert isinstance(result, bool), "VAD should return boolean"
def test_streaming_vad_process_chunk(
self, benchmark: BenchmarkFixture, streaming_vad: StreamingVad, audio_chunk: NDArray[np.float32]
self,
benchmark: BenchmarkFixture,
streaming_vad: StreamingVad,
audio_chunk: NDArray[np.float32],
) -> None:
"""Benchmark StreamingVad.process_chunk() call."""
result = typed_benchmark(benchmark, bool, streaming_vad.process_chunk, audio_chunk)
@@ -392,14 +403,20 @@ class TestRmsLevelProviderBenchmark:
"""Benchmark tests for RmsLevelProvider methods."""
def test_get_rms(
self, benchmark: BenchmarkFixture, rms_provider: RmsLevelProvider, audio_chunk: NDArray[np.float32]
self,
benchmark: BenchmarkFixture,
rms_provider: RmsLevelProvider,
audio_chunk: NDArray[np.float32],
) -> None:
"""Benchmark get_rms() method."""
result = typed_benchmark(benchmark, float, rms_provider.get_rms, audio_chunk)
assert 0 <= result <= 1, "RMS should be normalized"
def test_get_db(
self, benchmark: BenchmarkFixture, rms_provider: RmsLevelProvider, audio_chunk: NDArray[np.float32]
self,
benchmark: BenchmarkFixture,
rms_provider: RmsLevelProvider,
audio_chunk: NDArray[np.float32],
) -> None:
"""Benchmark get_db() method."""
result = typed_benchmark(benchmark, float, rms_provider.get_db, audio_chunk)
@@ -465,7 +482,9 @@ class TestNumpyOperationsBenchmark:
class TestBufferOperationsBenchmark:
"""Benchmark tests for list operations used in buffers."""
def test_list_append(self, benchmark: BenchmarkFixture, audio_chunk: NDArray[np.float32]) -> None:
def test_list_append(
self, benchmark: BenchmarkFixture, audio_chunk: NDArray[np.float32]
) -> None:
"""Benchmark list append (partial buffer accumulation)."""
buffer: list[NDArray[np.float32]] = []
@@ -475,7 +494,9 @@ class TestBufferOperationsBenchmark:
benchmark(append)
assert buffer, "Buffer should have items"
def test_list_clear(self, benchmark: BenchmarkFixture, audio_chunk: NDArray[np.float32]) -> None:
def test_list_clear(
self, benchmark: BenchmarkFixture, audio_chunk: NDArray[np.float32]
) -> None:
"""Benchmark list clear (partial buffer clearing)."""
# Pre-fill buffer
buffer = [audio_chunk.copy() for _ in range(20)]
@@ -487,7 +508,9 @@ class TestBufferOperationsBenchmark:
benchmark(clear_and_refill)
def test_sum_lengths_naive(self, benchmark: BenchmarkFixture, audio_chunk: NDArray[np.float32]) -> None:
def test_sum_lengths_naive(
self, benchmark: BenchmarkFixture, audio_chunk: NDArray[np.float32]
) -> None:
"""Benchmark naive sum of chunk lengths (OLD segmenter pattern)."""
chunks = [audio_chunk.copy() for _ in range(20)]
@@ -515,6 +538,7 @@ class TestPartialBufferComparisonBenchmark:
self, benchmark: BenchmarkFixture, audio_chunk: NDArray[np.float32]
) -> None:
"""Benchmark OLD pattern: list append + np.concatenate (20 chunks = 2s)."""
def old_pattern() -> NDArray[np.float32]:
buffer: list[NDArray[np.float32]] = []
for _ in range(TYPICAL_PARTIAL_CHUNKS):
@@ -570,6 +594,7 @@ class TestPartialBufferComparisonBenchmark:
self, benchmark: BenchmarkFixture, audio_chunk: NDArray[np.float32]
) -> None:
"""Benchmark OLD pattern: 10 cycles of accumulate/concat/clear."""
def old_pattern_cycles() -> list[NDArray[np.float32]]:
results: list[NDArray[np.float32]] = []
for _ in range(10):