Raxol. UI. PerformanceTest
(Raxol v2.6.0)
View Source
Performance testing utilities for Raxol UI components.
Provides helpers for benchmarking render times, memory usage, and detecting performance regressions.
Usage
defmodule MyComponentPerfTest do
use ExUnit.Case
import Raxol.UI.PerformanceTest
test "button renders within time limit" do
assert_render_time(MyButton, [label: "Click"], max_ms: 5)
end
test "list handles many items efficiently" do
items = Enum.map(1..1000, &"Item #{&1}")
assert_render_time(MyList, [items: items], max_ms: 50)
end
end
Summary
Functions
Assert that memory usage stays within a limit.
Assert that a component renders within a time limit.
Benchmark the render time of a component.
Compare performance between two implementations.
Measure memory usage during component rendering.
Run a stress test on a component.
Functions
Assert that memory usage stays within a limit.
Options
:max_bytes- Maximum allowed memory increase in bytes:max_kb- Maximum allowed memory increase in kilobytes
Example
assert_memory(MyList, [items: many_items], max_kb: 100)
Assert that a component renders within a time limit.
Options
:max_ms- Maximum allowed render time in milliseconds (default: 16.67 for 60fps):iterations- Number of iterations for statistical significance
Example
assert_render_time(MyButton, [label: "Click"], max_ms: 5)
@spec benchmark_render( module(), keyword() ) :: %{ min: number(), max: number(), mean: float(), median: float(), std_dev: float(), p99: number(), count: non_neg_integer() }
Benchmark the render time of a component.
Options
:iterations- Number of render iterations (default: 100):warmup- Number of warmup iterations (default: 10):width- Buffer width (default: 80):height- Buffer height (default: 24)
Returns
A map with timing statistics:
:min- Minimum render time in microseconds:max- Maximum render time in microseconds:mean- Mean render time in microseconds:median- Median render time in microseconds:std_dev- Standard deviation:p99- 99th percentile
Example
stats = benchmark_render(MyButton, label: "Click")
IO.inspect(stats.mean, label: "Mean render time (us)")
@spec compare_performance({module(), keyword()}, {module(), keyword()}, keyword()) :: %{ component_a: map(), component_b: map(), speedup: float(), faster: :a | :b }
Compare performance between two implementations.
Example
comparison = compare_performance(
{OldButton, [label: "Click"]},
{NewButton, [label: "Click"]}
)
@spec measure_memory( module(), keyword() ) :: %{ memory_before: non_neg_integer(), memory_after: non_neg_integer(), memory_delta: integer(), heap_size: non_neg_integer(), reductions: non_neg_integer() }
Measure memory usage during component rendering.
Options
:iterations- Number of render iterations:gc_before- Run garbage collection before measuring (default: true)
Returns
A map with memory statistics:
:heap_size- Heap size after rendering:memory_delta- Memory change during rendering:reductions- Number of reductions
Example
mem_stats = measure_memory(MyButton, label: "Click")
@spec stress_test( module(), keyword() ) :: %{ total_iterations: non_neg_integer(), batches: list(), degradation: float(), first_batch_mean: float(), last_batch_mean: float() }
Run a stress test on a component.
Renders the component many times and checks for degradation.
Options
:iterations- Total number of iterations (default: 1000):batch_size- Iterations per batch for measuring degradation (default: 100)
Returns
A map with stress test results:
:total_iterations- Number of iterations completed:batches- Statistics for each batch:degradation- Percentage slowdown from first to last batch
Example
results = stress_test(MyButton, label: "Click")