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_memory(component, props, opts \\ [])

@spec assert_memory(module(), keyword(), keyword()) :: :ok

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_render_time(component, props, opts \\ [])

@spec assert_render_time(module(), keyword(), keyword()) :: :ok

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)

benchmark_render(component, opts \\ [])

@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)")

compare_performance(arg1, arg2, opts \\ [])

@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"]}
)

measure_memory(component, opts \\ [])

@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")

stress_test(component, opts \\ [])

@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")