Avatar for the KittyCAD user
KittyCAD
modeling-app
Instrumentation
Wall Time
BlogDocsChangelog

KCL: Avoid recasting array items twice

#7876
Comparing
achalmers/faster-array-recast
(
b9aa82d
) with
main
(
d8a4ac7
)
CodSpeed Performance Gauge
+16%
Improvements
3
Regressions
0
Untouched
86
New
0
Dropped
0
Ignored
0

Benchmarks

Improved

mock_execute_mike_stress_test_program
rust/kcl-lib/benches/compiler_benchmark_criterion.rs::benches::bench_mock_warmed_up::mock_execute_mike_stress_test_program
CodSpeed Performance Gauge
+16%
316.5 ms
273.6 ms
recast_medium_sketch
rust/kcl-lib/benches/compiler_benchmark_criterion.rs::benches::recast::recast_medium_sketch
CodSpeed Performance Gauge
+11%
178.5 µs
160.4 µs
recast_mike_stress_test_program
rust/kcl-lib/benches/compiler_benchmark_criterion.rs::benches::recast::recast_mike_stress_test_program
CodSpeed Performance Gauge
+11%
2.6 ms
2.4 ms

Passed

parse_pillow-block-bearing
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::pillow-block-bearing::parse_pillow-block-bearing
CodSpeed Performance Gauge
+1%
325.5 µs
322.3 µs
parse_food-service-spatula
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::food-service-spatula::parse_food-service-spatula
CodSpeed Performance Gauge
0%
760.6 ms
758.7 ms
parse_hex-nut
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::hex-nut::parse_hex-nut
CodSpeed Performance Gauge
0%
18.7 ms
18.6 ms
parse_washer
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::washer::parse_washer
CodSpeed Performance Gauge
0%
6.2 ms
6.2 ms
parse_pipe-with-bend
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::pipe-with-bend::parse_pipe-with-bend
CodSpeed Performance Gauge
0%
10.5 ms
10.5 ms
parse_pipe
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::pipe::parse_pipe
CodSpeed Performance Gauge
0%
3.7 ms
3.7 ms
parse_dodecahedron
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::dodecahedron::parse_dodecahedron
CodSpeed Performance Gauge
0%
82.3 ms
82.1 ms
parse_car-wheel-assembly
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::car-wheel-assembly::parse_car-wheel-assembly
CodSpeed Performance Gauge
0%
3 ms
3 ms
parse_i-beam
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::i-beam::parse_i-beam
CodSpeed Performance Gauge
0%
3.9 ms
3.9 ms
parse_helium-tank
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::helium-tank::parse_helium-tank
CodSpeed Performance Gauge
0%
185 ms
184.7 ms
parse_flange
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::flange::parse_flange
CodSpeed Performance Gauge
0%
10.9 ms
10.9 ms
parse_hammer
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::hammer::parse_hammer
CodSpeed Performance Gauge
0%
7.2 s
7.1 s
parse_multi-axis-robot
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::multi-axis-robot::parse_multi-axis-robot
CodSpeed Performance Gauge
0%
488.6 µs
487.7 µs
parse_brake-rotor
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::brake-rotor::parse_brake-rotor
CodSpeed Performance Gauge
0%
152.1 ms
151.8 ms
parse_gridfinity-baseplate
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::gridfinity-baseplate::parse_gridfinity-baseplate
CodSpeed Performance Gauge
0%
162.9 ms
162.6 ms
parse_surgical-drill-guide
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::surgical-drill-guide::parse_surgical-drill-guide
CodSpeed Performance Gauge
0%
283 ms
282.6 ms
parse_bone-plate
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::bone-plate::parse_bone-plate
CodSpeed Performance Gauge
0%
44.8 ms
44.7 ms
parse_clock
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::clock::parse_clock
CodSpeed Performance Gauge
0%
1.6 s
1.6 s
parse_gridfinity-bins
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::gridfinity-bins::parse_gridfinity-bins
CodSpeed Performance Gauge
0%
213.3 ms
213 ms
parse_spur-reduction-gearset
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::spur-reduction-gearset::parse_spur-reduction-gearset
CodSpeed Performance Gauge
0%
15.8 ms
15.7 ms
parse_cpu-cooler
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::cpu-cooler::parse_cpu-cooler
CodSpeed Performance Gauge
0%
9 ms
9 ms
parse_exhaust-manifold
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::exhaust-manifold::parse_exhaust-manifold
CodSpeed Performance Gauge
0%
113 ms
112.8 ms
parse_engine-valve
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::engine-valve::parse_engine-valve
CodSpeed Performance Gauge
0%
66.7 ms
66.6 ms
parse_makeup-mirror
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::makeup-mirror::parse_makeup-mirror
CodSpeed Performance Gauge
0%
48.5 ms
48.4 ms
parse_herringbone-planetary-gearset
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::herringbone-planetary-gearset::parse_herringbone-planetary-gearset
CodSpeed Performance Gauge
0%
74 ms
73.9 ms
parse_herringbone-gear
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::herringbone-gear::parse_herringbone-gear
CodSpeed Performance Gauge
0%
34.8 ms
34.7 ms
parse_helical-planetary-gearset
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::helical-planetary-gearset::parse_helical-planetary-gearset
CodSpeed Performance Gauge
0%
77.1 ms
76.9 ms
parse_tooling-nest-block
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::tooling-nest-block::parse_tooling-nest-block
CodSpeed Performance Gauge
0%
75.1 ms
75 ms
parse_bottle
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::bottle::parse_bottle
CodSpeed Performance Gauge
0%
8.3 ms
8.3 ms
parse_gridfinity-bins-stacking-lip
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::gridfinity-bins-stacking-lip::parse_gridfinity-bins-stacking-lip
CodSpeed Performance Gauge
0%
323.7 ms
323.2 ms
parse_french-press
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::french-press::parse_french-press
CodSpeed Performance Gauge
0%
116.4 ms
116.2 ms
parse_kitt
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::kitt::parse_kitt
CodSpeed Performance Gauge
0%
153.8 ms
153.6 ms
parse_utility-sink
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::utility-sink::parse_utility-sink
CodSpeed Performance Gauge
0%
195.1 ms
194.8 ms
parse_wing-spar
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::wing-spar::parse_wing-spar
CodSpeed Performance Gauge
0%
85.4 ms
85.3 ms
parse_keyboard
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::keyboard::parse_keyboard
CodSpeed Performance Gauge
0%
224.1 ms
223.8 ms
parse_socket-head-cap-screw
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::socket-head-cap-screw::parse_socket-head-cap-screw
CodSpeed Performance Gauge
0%
14.3 ms
14.3 ms
parse_helical-gear
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::helical-gear::parse_helical-gear
CodSpeed Performance Gauge
0%
37.8 ms
37.7 ms
parse_prosthetic-hip
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::prosthetic-hip::parse_prosthetic-hip
CodSpeed Performance Gauge
0%
142.2 ms
142 ms
parse_truss-structure
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::truss-structure::parse_truss-structure
CodSpeed Performance Gauge
0%
75.9 ms
75.8 ms
parse_ball-joint-rod-end
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::ball-joint-rod-end::parse_ball-joint-rod-end
CodSpeed Performance Gauge
0%
164.7 ms
164.5 ms
parse_countersunk-plate
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::countersunk-plate::parse_countersunk-plate
CodSpeed Performance Gauge
0%
19.1 ms
19.1 ms
parse_color-cube
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::color-cube::parse_color-cube
CodSpeed Performance Gauge
0%
23.3 ms
23.3 ms
parse_ball-bearing
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::ball-bearing::parse_ball-bearing
CodSpeed Performance Gauge
0%
36.1 ms
36.1 ms
parse_t-slot-rail
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::t-slot-rail::parse_t-slot-rail
CodSpeed Performance Gauge
0%
28.3 ms
28.2 ms
parse_shepherds-hook-bolt
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::shepherds-hook-bolt::parse_shepherds-hook-bolt
CodSpeed Performance Gauge
0%
75 ms
74.9 ms
parse_bracket
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::bracket::parse_bracket
CodSpeed Performance Gauge
0%
73.2 ms
73.1 ms
parse_cycloidal-gear
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::cycloidal-gear::parse_cycloidal-gear
CodSpeed Performance Gauge
0%
70 ms
69.9 ms
parse_sheet-metal-bracket
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::sheet-metal-bracket::parse_sheet-metal-bracket
CodSpeed Performance Gauge
0%
34.2 ms
34.2 ms
parse_teapot
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::teapot::parse_teapot
CodSpeed Performance Gauge
0%
44.2 ms
44.1 ms
parse_pipe-flange-assembly
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::pipe-flange-assembly::parse_pipe-flange-assembly
CodSpeed Performance Gauge
0%
12.5 ms
12.5 ms
parse_curtain-wall-anchor-plate
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::curtain-wall-anchor-plate::parse_curtain-wall-anchor-plate
CodSpeed Performance Gauge
0%
165.6 ms
165.3 ms
parse_gear-rack
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::gear-rack::parse_gear-rack
CodSpeed Performance Gauge
0%
22.5 ms
22.5 ms
parse_poopy-shoe
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::poopy-shoe::parse_poopy-shoe
CodSpeed Performance Gauge
0%
83.6 ms
83.5 ms
parse_mounting-plate
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::mounting-plate::parse_mounting-plate
CodSpeed Performance Gauge
0%
122.2 ms
122 ms
parse_router-template-cross-bar
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::router-template-cross-bar::parse_router-template-cross-bar
CodSpeed Performance Gauge
0%
47.6 ms
47.5 ms
parse_focusrite-scarlett-mounting-bracket
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::focusrite-scarlett-mounting-bracket::parse_focusrite-scarlett-mounting-bracket
CodSpeed Performance Gauge
0%
102.2 ms
102.1 ms
parse_mike_stress_test
rust/kcl-lib/benches/compiler_benchmark_criterion.rs::benches::bench_parse::parse_mike_stress_test
CodSpeed Performance Gauge
0%
922.4 ms
921.2 ms
parse_bench
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::bench::parse_bench
CodSpeed Performance Gauge
0%
50 ms
50 ms
parse_sash-window
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::sash-window::parse_sash-window
CodSpeed Performance Gauge
0%
84.6 ms
84.5 ms
parse_spinning-highrise-tower
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::spinning-highrise-tower::parse_spinning-highrise-tower
CodSpeed Performance Gauge
0%
48.7 ms
48.7 ms
parse_cold-plate
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::cold-plate::parse_cold-plate
CodSpeed Performance Gauge
0%
38.9 ms
38.8 ms
parse_enclosure
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::enclosure::parse_enclosure
CodSpeed Performance Gauge
0%
190.7 ms
190.4 ms
parse_spool
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::spool::parse_spool
CodSpeed Performance Gauge
0%
22.4 ms
22.4 ms
parse_mug
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::mug::parse_mug
CodSpeed Performance Gauge
0%
26.5 ms
26.5 ms
parse_walkie-talkie
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::walkie-talkie::parse_walkie-talkie
CodSpeed Performance Gauge
0%
5.1 ms
5.1 ms
parse_thermal-block-insert
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::thermal-block-insert::parse_thermal-block-insert
CodSpeed Performance Gauge
0%
17.3 ms
17.3 ms
parse_counterdrilled-weldment
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::counterdrilled-weldment::parse_counterdrilled-weldment
CodSpeed Performance Gauge
0%
85.5 ms
85.4 ms
parse_pdu-faceplate
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::pdu-faceplate::parse_pdu-faceplate
CodSpeed Performance Gauge
0%
83.4 ms
83.4 ms
parse_spur-gear
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::spur-gear::parse_spur-gear
CodSpeed Performance Gauge
0%
17.4 ms
17.4 ms
parse_router-template-slate
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::router-template-slate::parse_router-template-slate
CodSpeed Performance Gauge
0%
33.4 ms
33.4 ms
parse_lego
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::lego::parse_lego
CodSpeed Performance Gauge
0%
30.6 ms
30.6 ms
parse_gridfinity-baseplate-magnets
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::gridfinity-baseplate-magnets::parse_gridfinity-baseplate-magnets
CodSpeed Performance Gauge
0%
287.1 ms
286.9 ms
parse_telemetry-antenna
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::telemetry-antenna::parse_telemetry-antenna
CodSpeed Performance Gauge
0%
52 ms
51.9 ms
mock_execute_medium_sketch
rust/kcl-lib/benches/compiler_benchmark_criterion.rs::benches::bench_mock_warmed_up::mock_execute_medium_sketch
CodSpeed Performance Gauge
0%
9.8 ms
9.8 ms
parse_pipes_on_pipes
rust/kcl-lib/benches/compiler_benchmark_criterion.rs::benches::bench_parse::parse_pipes_on_pipes
CodSpeed Performance Gauge
0%
813.1 ms
812.5 ms
parse_cube
rust/kcl-lib/benches/compiler_benchmark_criterion.rs::benches::bench_parse::parse_cube
CodSpeed Performance Gauge
0%
9.8 ms
9.8 ms
parse_big_kitt
rust/kcl-lib/benches/compiler_benchmark_criterion.rs::benches::bench_parse::parse_big_kitt
CodSpeed Performance Gauge
0%
244.2 ms
244.1 ms
digest_math
rust/kcl-lib/benches/digest_benchmark.rs::benches::bench_digest::digest_math
CodSpeed Performance Gauge
0%
1.2 ms
1.2 ms
digest_lsystem
rust/kcl-lib/benches/digest_benchmark.rs::benches::bench_digest::digest_lsystem
CodSpeed Performance Gauge
0%
2.2 ms
2.2 ms
digest_pipes_on_pipes
rust/kcl-lib/benches/digest_benchmark.rs::benches::bench_digest::digest_pipes_on_pipes
CodSpeed Performance Gauge
0%
19.5 ms
19.5 ms
digest_cube
rust/kcl-lib/benches/digest_benchmark.rs::benches::bench_digest::digest_cube
CodSpeed Performance Gauge
0%
423.3 µs
423.4 µs
digest_big_kitt
rust/kcl-lib/benches/digest_benchmark.rs::benches::bench_digest::digest_big_kitt
CodSpeed Performance Gauge
0%
6.5 ms
6.5 ms
digest_mike_stress_test
rust/kcl-lib/benches/digest_benchmark.rs::benches::bench_digest::digest_mike_stress_test
CodSpeed Performance Gauge
0%
20.9 ms
20.9 ms
parse_koch snowflake
rust/kcl-lib/benches/compiler_benchmark_criterion.rs::benches::bench_parse::parse_koch snowflake
CodSpeed Performance Gauge
0%
510.5 ms
510.8 ms
parse_axial-fan
rust/kcl-lib/benches/benchmark_kcl_samples.rs::benches::run_benchmarks::axial-fan::parse_axial-fan
CodSpeed Performance Gauge
0%
411.5 µs
412.5 µs
parse_math
rust/kcl-lib/benches/compiler_benchmark_criterion.rs::benches::bench_parse::parse_math
CodSpeed Performance Gauge
0%
32.3 ms
32.4 ms

Commits

Click on a commit to change the comparison range
Base
main
d8a4ac7
+16%
KCL: Faster recasting of arrays Before this PR, array expression recasting was a bit slow. The reason was that there's two ways to recast an array: - Single line array string (all items on one line) - Multi-line array string (n lines, one per item) The steps were basically: 1. Recast each item, collecting into a vec with n strings (one string per item) 2. Concat the items into a single-line array string 3. If the line is too long, discard it and do a multi-line array string. Giving each item its own string meant we were doing N allocations (one per item) but it meant that each item was only recast once. This PR has a better approach. We build a single-line array first, and if it's too long, then ignore it and do a multi-line array. HOWEVER, the difference is that we track each item's offset within the single-line array string. If we then need to convert it into a multi-line array string, we can do that easily by looking up each item's offset. Improves benchmarks by 7% and 20% on my macbook pro.
b9aa82d
22 days ago
by adamchalmers
© 2025 CodSpeed Technology
Home Terms Privacy Docs