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
Use appropriate resolution: More isn’t always better
Leverage vectorization: NumPy/CuPy operations
Minimize data transfer: Keep data on GPU
Profile before optimizing: Measure, don’t guess
See Also
Architecture - Code organization
GPU Acceleration - GPU usage