25 [4466.856635, 4471.570342, 4473.393354, 4475.139095, 4472.841865]
28 [4308.499611, 4332.886647, 4330.142051, 4330.850781, 4322.548658]
31 [217.024511, 217.555523, 218.379073, 218.838467, 215.628848]
50 samples = [NATIVE_TIMES_MS, EIGEN_TIMES_MS, VULKAN_TIMES_MS]
52 PREVIOUS_NATIVE_TIMES_MS,
53 PREVIOUS_EIGEN_TIMES_MS,
54 PREVIOUS_VULKAN_TIMES_MS,
56 means = np.array([values.mean()
for values
in samples])
57 previous_means = np.array([values.mean()
for values
in previous_samples])
58 fps = FRAME_COUNT / (means / 1000.0)
59 scale_cost = (means - previous_means) / previous_means * 100.0
61 eigen_reduction = (means[0] - means[1]) / means[0] * 100.0
62 vulkan_reduction = (means[0] - means[2]) / means[0] * 100.0
63 vulkan_speedup = means[0] / means[2]
65 figure = plt.figure(figsize=(12, 6.75), dpi=100, facecolor=BACKGROUND_COLOR)
66 axis = figure.add_axes((0.14, 0.24, 0.77, 0.46), facecolor=PANEL_COLOR)
71 f
"Pixel-heavy sphere: Vulkan is {vulkan_speedup:.1f}× faster",
79 "Scale 2.0 • 65,024 triangles • 320×180 framebuffer • 600 frames • 5-run average",
80 color=MUTED_TEXT_COLOR,
84 y_positions = [2, 1, 0]
89 color=[NATIVE_COLOR, EIGEN_COLOR, VULKAN_COLOR],
94 point_offsets = np.linspace(-0.14, 0.14, len(NATIVE_TIMES_MS))
95 for values, y_position, point_color
in zip(
96 samples, y_positions, POINT_COLORS, strict=
True
100 y_position + point_offsets,
103 edgecolor=BACKGROUND_COLOR,
108 for mean, y_position
in zip(means, y_positions, strict=
True):
111 axis.set_xlim(0, 5100)
112 axis.set_ylim(-0.55, 2.55)
113 axis.set_yticks(y_positions, [
"Native CPU",
"Eigen CPU",
"Vulkan GPU"])
115 "Average time for 600 frames (lower is better)",
116 color=MUTED_TEXT_COLOR,
120 axis.tick_params(axis=
"x", colors=MUTED_TEXT_COLOR, labelsize=11)
121 axis.tick_params(axis=
"y", colors=TEXT_COLOR, labelsize=16, length=0, pad=12)
122 axis.xaxis.grid(
True, color=GRID_COLOR, linewidth=1, alpha=0.65)
123 axis.set_axisbelow(
True)
124 for spine
in axis.spines.values():
125 spine.set_visible(
False)
130 f
"Native {fps[0]:,.0f} FPS • Eigen {fps[1]:,.0f} FPS • Vulkan {fps[2]:,.0f} FPS",
138 f
"10× scale cost: Native {scale_cost[0]:+.1f}% • Eigen {scale_cost[1]:+.1f}% • Vulkan {scale_cost[2]:+.1f}%",
139 color=MUTED_TEXT_COLOR,
145 f
"Eigen saves {eigen_reduction:.1f}% • Vulkan saves {vulkan_reduction:.1f}%",
152 output_path = Path(__file__).with_name(
153 "benchmark_obj_backends_scale2_pixel_heavy.png"
155 figure.savefig(output_path, dpi=160, facecolor=figure.get_facecolor())
158 print(f
"Native mean: {means[0]:.3f} ms ({fps[0]:.1f} FPS)")
159 print(f
"Eigen mean: {means[1]:.3f} ms ({fps[1]:.1f} FPS)")
160 print(f
"Vulkan mean: {means[2]:.3f} ms ({fps[2]:.1f} FPS)")
161 print(f
"Eigen vs native: {eigen_reduction:.3f}% less time")
163 f
"Vulkan vs native: {vulkan_reduction:.3f}% less time "
164 f
"({vulkan_speedup:.3f}x faster)"
167 "Scale 0.2 to 2.0 timing change: "
168 f
"native {scale_cost[0]:+.3f}%, "
169 f
"Eigen {scale_cost[1]:+.3f}%, "
170 f
"Vulkan {scale_cost[2]:+.3f}%"