From f68101896fe6d333b8670586b89ceb6b738b6955 Mon Sep 17 00:00:00 2001 From: Travis Vasceannie Date: Sat, 24 Jan 2026 19:27:58 +0000 Subject: [PATCH] .. --- tests/benchmarks/test_hot_paths.py | 45 +++++++++++++++++++++++------- 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/tests/benchmarks/test_hot_paths.py b/tests/benchmarks/test_hot_paths.py index 8ad9c81..075e6db 100644 --- a/tests/benchmarks/test_hot_paths.py +++ b/tests/benchmarks/test_hot_paths.py @@ -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):