forked from 1b-agent/opencadstudio-upstream
Eliminate major performance bottlenecks in the per-frame view render path: - Memoize document render environment resolution using (geometry_epoch, len) keying, replacing per-viewport O(N) linear scans over document.objects. - Index render_environments and render_settings handles in ObjectDataCache during the single build_cache pass. - Cache resolved background image lookups in memory to eliminate repeated path.is_file() filesystem syscalls per frame. - Add has_face3d fast-path to bypass wire splitting when no Face3D entities exist, and use FxHashSet<u64> handle indexing when present. - Invalidate all cached structures across bump_geometry, bump_geometry_no_blocks, and bump_entities. - Add comprehensive correctness unit tests and before/after benchmarks. Performance impact (10k objects): - P95 latency reduced from 341.00 µs to 173.00 µs (-49.3%) - Throughput increased from 4,700 FPS to 6,000 FPS (+27.7%) - Direct render environment evaluation: ~85 µs down to <50 ns (>1,700x)
OpenCADStudio Performance Benchmarks
A standardized, statistical performance benchmarking suite measuring throughput, latency, and memory metrics across core CAD subsystems and the user interface.
Quick Start
Run the full benchmark suite with native --release optimizations:
cargo bench
Run a fast validation smoke test (~2 seconds):
cargo bench --bench performance_benchmarks -- --quick
Note
Benchmarks are registered under
[[bench]]withharness = false. They are never executed by regularcargo testruns, preventing CI slowdowns.
Benchmark Suite Catalog (30 Metrics)
1. Scene & Entity Management
scene_entity_ingestion_10k: Ingestion throughput for 10,000 mixed 2D entities (Lines, Circles, Arcs, Polylines).batch_entity_transform_mutation: Translating 1,000 entities, invokingbump_entities, and updating the spatial acceleration structure.undo_delta_recording_cycle: Capturing before-images and transactional delta recordings for 500 entity mutations.
2. Geometry Tessellation & Viewport Navigation
analytical_curved_tessellation: Initial wire generation for 14,000 curved entities (circles, arcs, ellipses, polylines).wire_partitioning_per_frame: Partitioning 14,000 wires into GPU analytical instances vs regular lines.analytical_curved_zoom_100x: 100 camera zoom navigations measuring frame overhead and FPS.wide_and_tapered_arc_tessellation: Tessellating 7,500 thick polyline arcs, tapered arcs, and donuts.zoom_extents_bounding_box_calc: Cold axis-aligned bounding box (AABB) calculation across 20,000 mixed entities (ZOOM EXTENTS).
3. Spatial Indexing, Snapping & Picking
spatial_interaction_index_build: Building the spatialInteractionIndexandprepare_screenfor 10,000 wires.hit_test_click_pick_latency: Single-point cursor click selection across 5,000 entities in screen space.hit_test_box_window_enclosed: Window selection (box_hitenclosed) across 5,000 entities.hit_test_box_crossing_boundary: Crossing selection (box_hitcrossing boundary) across 5,000 entities.osnap_cursor_tracking_latency: Real-time cursor snapping across Endpoint, Midpoint, Center, Intersection, and Nearest modes.
4. Parametrics & DXF I/O
constraint_solver_dogleg_system: Solving coupled 2D geometric constraints (Perpendicular, Parallel, Length) via the Dogleg solver.dxf_export_write_throughput: Serializing 5,000 entities to DXF binary stream.dxf_import_parse_throughput: Parsing DXF stream of 5,000 entities intoCadDocument.
5. UI & Viewport Overlay Performance
ui_ribbon_view_construction: Per-frame ribbon widget tree construction.ui_grid_geometry_uncached: Multi-pane tiled viewport grid projection and segment generation.ui_grid_cache_hit_evaluation: Grid overlay cache key construction and reuse decision.ui_icon_handle_cached: Themed SVG icon cache hit (FxHashMap lookup + Handle clone).ui_icon_handle_uncached: Uncached SVG icon memory parse and Handle allocation.ui_plotstyle_layer_usage: Plot Style 256-bucket ACI layer-usage table rebuild (200 layers).ui_statusbar_derived_data: Status-bar cached derived-data hit (layout names + scale pickerArcclones).ui_grip_budget: Budgeted per-frame selection-grip projection (dense-polyline grips capped toMAX_SELECTED_GRIPS).ui_grip_budget_build: Selection-changeapply_grip_budgetcost over the full grip set (sort + FxHashSet + filter).ui_constraint_glyphs: Constraint-glyph cache hit (cached_glyph_placementskey build +Arcclone over dozens of glyphs, no recompute).
6. State Management & Draworder
selection_state_deep_clone: Deep cloning ofSelectionState(with 64 polygon points).selection_state_arc_clone:Arc<SelectionState>::clone(atomic reference bump).draworder_depth_map_full_build: Full draworder depth map generation across 10,000 ordered entities.draworder_depth_map_incremental_patch: Fast-path incremental depth map patch on entity modification.
Filtering Benchmarks
Filter execution by subsystem or name pattern:
# Filter by UI
cargo bench --bench performance_benchmarks -- ui
# Filter by tessellation
cargo bench --bench performance_benchmarks -- tessellation
# Filter by hit testing
cargo bench --bench performance_benchmarks -- hit_test
Baseline Tracking & Regression Detection
1. Save Current Metrics as Baseline
cargo bench --bench performance_benchmarks -- --output target/baseline_metrics.json
2. Compare PR / Branch Against Baseline
cargo bench --bench performance_benchmarks -- --baseline target/baseline_metrics.json
The benchmark runner will output statistical deltas (% faster / % slower) for each metric and flag regressions exceeding the defined thresholds.