Performance Benchmarks

Performance benchmarks help track Prismo’s computational efficiency.

Running Benchmarks

# Run all benchmarks
python benchmarks/test_performance.py

# Specific benchmark
pytest benchmarks/ -k test_fdtd_step --benchmark-only

# With pytest-benchmark
pytest benchmarks/ --benchmark-only --benchmark-autosave

Typical Performance

2D Simulation

Configuration:

  • Grid: 500 × 500 points

  • Time steps: 1000

  • Backend: NumPy (CPU)

Performance:

  • Time per step: ~50 ms

  • Total time: ~50 seconds

  • Memory: ~200 MB

3D Simulation

Configuration:

  • Grid: 200 × 200 × 200 points

  • Time steps: 1000

  • Backend: NumPy (CPU)

Performance:

  • Time per step: ~2 seconds

  • Total time: ~30 minutes

  • Memory: ~2 GB

GPU Acceleration

Speedup (GPU vs CPU):

  • 2D: 5-10×

  • 3D: 20-50×

Benchmark Suite

import pytest
from prismo import Simulation

@pytest.mark.benchmark
def test_fdtd_step_2d(benchmark):
    """Benchmark single FDTD time step (2D)."""
    sim = Simulation(
        size=(10e-6, 10e-6, 0.0),
        resolution=50e6,  # 500x500 grid
    )
    sim.initialize()

    result = benchmark(sim.step)

    assert result is not None

@pytest.mark.benchmark
def test_full_simulation(benchmark):
    """Benchmark full simulation run."""
    def run_sim():
        sim = Simulation(...)
        sim.add_source(...)
        sim.run(100e-15)
        return sim

    result = benchmark(run_sim)

Profiling

CPU Profiling

import cProfile
import pstats

profiler = cProfile.Profile()
profiler.enable()

# Run simulation
sim.run(100e-15)

profiler.disable()
stats = pstats.Stats(profiler)
stats.sort_stats('cumulative')
stats.print_stats(20)  # Top 20 functions

Memory Profiling

from memory_profiler import profile

@profile
def run_simulation():
    sim = Simulation(...)
    sim.run(100e-15)

run_simulation()

Optimization Guidelines

  1. Use appropriate resolution: More isn’t always better

  2. Leverage vectorization: NumPy/CuPy operations

  3. Minimize data transfer: Keep data on GPU

  4. Profile before optimizing: Measure, don’t guess

See Also