Skip to content

Commit db10e5d

Browse files
Mike ProsserMike Prosser
authored andcommitted
use timeit for performance measurements
1 parent ae872ac commit db10e5d

File tree

2 files changed

+46
-38
lines changed

2 files changed

+46
-38
lines changed

examples/performance_checker/performance_checker.py

Lines changed: 31 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
"""Example of using nipanel to display a sine wave graph using st_echarts."""
1+
"""Check the performance of get_value and set_value methods in nipanel."""
22

33
import math
44
import time
5+
import timeit
56
from pathlib import Path
67

78
import numpy as np
@@ -18,35 +19,43 @@
1819
time_points = np.linspace(0, num_points, num_points)
1920
sine_values = amplitude * np.sin(frequency * time_points)
2021

21-
start_time = time.time()
22-
for i in range(100):
22+
23+
def _set_time_points():
2324
panel.set_value("time_points", time_points.tolist())
24-
stop_time = time.time()
25-
print(f"Average time to set 'time_points': {(stop_time - start_time) * 10:.2f} ms")
2625

27-
start_time = time.time()
28-
for i in range(100):
29-
panel.set_value("amplitude", 1.0)
30-
stop_time = time.time()
31-
print(f"Average time to set 'amplitude': {(stop_time - start_time) * 10:.2f} ms")
3226

33-
start_time = time.time()
34-
for i in range(100):
27+
def _set_amplitude():
28+
panel.set_value("amplitude", amplitude)
29+
30+
31+
def _get_time_points():
3532
panel.get_value("time_points", [0.0])
36-
stop_time = time.time()
37-
print(f"Average time to get 'time_points': {(stop_time - start_time) * 10:.2f} ms")
3833

39-
start_time = time.time()
40-
for i in range(100):
34+
35+
def _get_amplitude():
4136
panel.get_value("amplitude", 1.0)
42-
stop_time = time.time()
43-
print(f"Average time to get 'amplitude': {(stop_time - start_time) * 10:.2f} ms")
4437

45-
start_time = time.time()
46-
for i in range(100):
38+
39+
def _get_unset_value():
4740
panel.get_value("unset_value", 1.0)
48-
stop_time = time.time()
49-
print(f"Average time to get 'unset_value': {(stop_time - start_time) * 10:.2f} ms")
41+
42+
43+
iterations = 100
44+
45+
set_time_points_time = timeit.timeit(_set_time_points, number=iterations) * 1000 / iterations
46+
print(f"Average time to set 'time_points': {set_time_points_time:.2f} ms")
47+
48+
set_amplitude_time = timeit.timeit(_set_amplitude, number=iterations) * 1000 / iterations
49+
print(f"Average time to set 'amplitude': {set_amplitude_time:.2f} ms")
50+
51+
get_time_points_time = timeit.timeit(_get_time_points, number=iterations) * 1000 / iterations
52+
print(f"Average time to get 'time_points': {get_time_points_time:.2f} ms")
53+
54+
get_amplitude_time = timeit.timeit(_get_amplitude, number=iterations) * 1000 / iterations
55+
print(f"Average time to get 'amplitude': {get_amplitude_time:.2f} ms")
56+
57+
get_unset_value_time = timeit.timeit(_get_unset_value, number=iterations) * 1000 / iterations
58+
print(f"Average time to get 'unset_value': {get_unset_value_time:.2f} ms")
5059

5160
try:
5261
print(f"Panel URL: {panel.panel_url}")

examples/performance_checker/performance_checker_panel.py

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import statistics
44
import time
5+
import timeit
6+
from functools import partial
57
from typing import Any, Tuple
68

79
import streamlit as st
@@ -11,29 +13,31 @@
1113

1214

1315
def profile_get_value(
14-
panel: "nipanel.StreamlitPanelValueAccessor", value_id: str, default_value: Any = None
16+
panel: "nipanel.StreamlitPanelValueAccessor",
17+
value_id: str,
18+
default_value: Any = None,
19+
num_runs: int = 5,
1520
) -> Tuple[Any, float]:
1621
"""Measure the time it takes to get a value from the panel.
1722
1823
Args:
1924
panel: The panel accessor object
2025
value_id: The ID of the value to get
2126
default_value: Default value if the value is not found
27+
num_runs: Number of runs for timing
2228
2329
Returns:
2430
A tuple of (value, time_ms) where time_ms is the time in milliseconds
2531
"""
26-
start_time = time.time()
2732
value = panel.get_value(value_id, default_value)
28-
end_time = time.time()
29-
time_ms = (end_time - start_time) * 1000
33+
get_value_func = partial(panel.get_value, value_id, default_value)
34+
time_ms = timeit.timeit(get_value_func, number=num_runs) * 1000 / num_runs
3035
return value, time_ms
3136

3237

3338
st.set_page_config(page_title="Performance Checker Example", page_icon="📈", layout="wide")
3439
st.title("Performance Checker Example")
3540

36-
# Initialize refresh history list if it doesn't exist
3741
if "refresh_history" not in st.session_state:
3842
st.session_state.refresh_history = [] # List of tuples (timestamp, refresh_time_ms)
3943

@@ -61,24 +65,21 @@ def profile_get_value(
6165
else:
6266
refresh_history = []
6367

64-
# Calculate statistics for refresh
6568
min_refresh_time = min(refresh_history) if refresh_history else 0
6669
max_refresh_time = max(refresh_history) if refresh_history else 0
6770
avg_refresh_time = statistics.mean(refresh_history) if refresh_history else 0
6871

6972
panel = nipanel.get_panel_accessor()
7073

71-
# Measure time to get each value
72-
time_points, time_points_ms = profile_get_value(panel, "time_points", [0.0])
73-
sine_values, sine_values_ms = profile_get_value(panel, "sine_values", [0.0])
74-
amplitude, amplitude_ms = profile_get_value(panel, "amplitude", 1.0)
75-
frequency, frequency_ms = profile_get_value(panel, "frequency", 1.0)
76-
unset_value, unset_value_ms = profile_get_value(panel, "unset_value", "default")
74+
num_timing_runs = 5
75+
time_points, time_points_ms = profile_get_value(panel, "time_points", [0.0], num_timing_runs)
76+
sine_values, sine_values_ms = profile_get_value(panel, "sine_values", [0.0], num_timing_runs)
77+
amplitude, amplitude_ms = profile_get_value(panel, "amplitude", 1.0, num_timing_runs)
78+
frequency, frequency_ms = profile_get_value(panel, "frequency", 1.0, num_timing_runs)
79+
unset_value, unset_value_ms = profile_get_value(panel, "unset_value", "default", num_timing_runs)
7780

78-
# Prepare data for echarts
7981
data = [{"value": [x, y]} for x, y in zip(time_points, sine_values)]
8082

81-
# Configure the chart options
8283
options = {
8384
"animation": False, # Disable animation for smoother updates
8485
"title": {"text": "Sine Wave"},
@@ -103,10 +104,8 @@ def profile_get_value(
103104
],
104105
}
105106

106-
# Display the chart
107107
st_echarts(options=options, height="400px", key="graph")
108108

109-
# Create columns for metrics
110109
col1, col2, col3 = st.columns(3)
111110
with col1:
112111
st.metric("Amplitude", f"{amplitude:.2f}")

0 commit comments

Comments
 (0)