Skip to content

Conversation

@indietyp
Copy link
Member

@indietyp indietyp commented Dec 19, 2025

🌟 What is the purpose of this PR?

Add CodSpeed benchmarking support to the repository, enabling performance tracking for Rust code.

Adding inline to the successor iterator gave us another 5-10% in speed, as this happened to be cross crate (hashql-mir -> hashql-core -> hashql-mir).

🔗 Related links

🔍 What does this change?

  • Adds a new GitHub workflow for running CodSpeed benchmarks
  • Integrates cargo-codspeed tool in mise configuration
  • Converts the existing Criterion benchmarks in hashql-mir to use CodSpeed's Criterion compatibility layer
  • Adds allocation limit control methods to the Heap implementation
  • Adds a build:codspeed script to the hashql-mir package.json

Pre-Merge Checklist 🚀

🚢 Has this modified a publishable library?

This PR:

  • does not modify any publishable blocks or libraries, or modifications do not need publishing

📜 Does this require a change to the docs?

The changes in this PR:

  • are internal and do not require a docs change

🕸️ Does this require a change to the Turbo Graph?

The changes in this PR:

  • affected the execution graph, and the turbo.json's have been updated to reflect this

🛡 What tests cover this?

  • The benchmarks themselves serve as tests for the functionality

❓ How to test this?

  1. Run turbo run build:codspeed --filter=hashql-mir to verify the benchmark builds
  2. Run cargo codspeed run to execute codspeed benchmarks locally

@cursor
Copy link

cursor bot commented Dec 19, 2025

PR Summary

Sets up CodSpeed performance benchmarking and adapts MIR transform benches to run under it.

  • Adds CodSpeed Benchmarks workflow (.github/workflows/codspeed.yml) and Turbo tasks build:codspeed/test:codspeed; wires package scripts in @rust/hashql-mir
  • Installs cargo-codspeed in .config/mise/config.toml and adds codspeed-criterion-compat to workspace deps; updates Cargo.lock
  • Migrates libs/@local/hashql/mir/benches/transform.rs from Criterion to codspeed-criterion-compat (uses iter_batched_ref, criterion_group!, criterion_main!), and registers a [[bench]] in hashql-mir/Cargo.toml
  • Extends heap APIs: Allocator::set_allocation_limit, Heap::set_allocation_limit, Scratch::with_capacity; adds inlining to CFG successor/iterator methods

Written by Cursor Bugbot for commit 90ffaed. This will update automatically on new commits. Configure here.

@github-actions github-actions bot added area/deps Relates to third-party dependencies (area) area/infra Relates to version control, CI, CD or IaC (area) area/libs Relates to first-party libraries/crates/packages (area) type/eng > backend Owned by the @backend team labels Dec 19, 2025
Copy link
Member Author

indietyp commented Dec 19, 2025

This stack of pull requests is managed by Graphite. Learn more about stacking.

@codecov
Copy link

codecov bot commented Dec 19, 2025

Codecov Report

❌ Patch coverage is 0% with 11 lines in your changes missing coverage. Please review.
✅ Project coverage is 59.02%. Comparing base (04285dd) to head (90ffaed).
⚠️ Report is 20 commits behind head on main.

Files with missing lines Patch % Lines
libs/@local/hashql/core/src/heap/scratch.rs 0.00% 5 Missing ⚠️
libs/@local/hashql/core/src/heap/allocator.rs 0.00% 3 Missing ⚠️
libs/@local/hashql/core/src/heap/mod.rs 0.00% 3 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #8204      +/-   ##
==========================================
- Coverage   59.02%   59.02%   -0.01%     
==========================================
  Files        1187     1187              
  Lines      112486   112497      +11     
  Branches     4939     4939              
==========================================
+ Hits        66394    66396       +2     
- Misses      45334    45343       +9     
  Partials      758      758              
Flag Coverage Δ
apps.hash-ai-worker-ts 1.40% <ø> (ø)
apps.hash-api 0.00% <ø> (ø)
blockprotocol.type-system 40.84% <ø> (ø)
local.claude-hooks 0.00% <ø> (ø)
local.harpc-client 51.24% <ø> (ø)
local.hash-graph-sdk 10.88% <ø> (ø)
local.hash-isomorphic-utils 0.00% <ø> (ø)
rust.antsi 0.00% <ø> (ø)
rust.error-stack 90.88% <ø> (ø)
rust.harpc-codec 84.70% <ø> (ø)
rust.harpc-net 96.19% <ø> (+0.03%) ⬆️
rust.harpc-tower 66.80% <ø> (ø)
rust.harpc-types 0.00% <ø> (ø)
rust.harpc-wire-protocol 92.23% <ø> (ø)
rust.hash-codec 72.76% <ø> (ø)
rust.hash-graph-api 2.89% <ø> (ø)
rust.hash-graph-authorization 62.47% <ø> (ø)
rust.hash-graph-postgres-store 25.61% <ø> (ø)
rust.hash-graph-store 30.54% <ø> (ø)
rust.hash-graph-temporal-versioning 47.95% <ø> (ø)
rust.hash-graph-types 0.00% <ø> (ø)
rust.hash-graph-validation 83.45% <ø> (ø)
rust.hashql-ast 87.25% <ø> (ø)
rust.hashql-compiletest 46.65% <ø> (ø)
rust.hashql-core 82.32% <0.00%> (-0.05%) ⬇️
rust.hashql-diagnostics 72.43% <ø> (ø)
rust.hashql-eval 68.54% <ø> (ø)
rust.hashql-hir 89.10% <ø> (ø)
rust.hashql-mir 88.18% <ø> (ø)
rust.hashql-syntax-jexpr 94.05% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@codspeed-hq
Copy link

codspeed-hq bot commented Dec 19, 2025

CodSpeed Performance Report

Congrats! CodSpeed is installed 🎉

🆕 13 new benchmarks were detected.

You will start to see performance impacts in the reports once the benchmarks are run from your default branch.

Detected benchmarks

@github-actions
Copy link
Contributor

Benchmark results

@rust/hash-graph-benches – Integrations

policy_resolution_large

Function Value Mean Flame graphs
resolve_policies_for_actor user: empty, selectivity: high, policies: 2002 $$25.1 \mathrm{ms} \pm 167 \mathrm{μs}\left({\color{lightgreen}-5.564 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: low, policies: 1 $$3.17 \mathrm{ms} \pm 12.9 \mathrm{μs}\left({\color{gray}-1.373 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: medium, policies: 1001 $$11.7 \mathrm{ms} \pm 75.8 \mathrm{μs}\left({\color{gray}-1.702 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: high, policies: 3314 $$41.4 \mathrm{ms} \pm 313 \mathrm{μs}\left({\color{gray}-0.451 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: low, policies: 1 $$13.7 \mathrm{ms} \pm 93.3 \mathrm{μs}\left({\color{gray}1.60 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: medium, policies: 1526 $$22.8 \mathrm{ms} \pm 136 \mathrm{μs}\left({\color{gray}-0.653 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: high, policies: 2078 $$25.9 \mathrm{ms} \pm 174 \mathrm{μs}\left({\color{lightgreen}-39.060 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: low, policies: 1 $$3.59 \mathrm{ms} \pm 20.7 \mathrm{μs}\left({\color{lightgreen}-81.949 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: medium, policies: 1033 $$13.5 \mathrm{ms} \pm 98.6 \mathrm{μs}\left({\color{lightgreen}-50.938 \mathrm{\%}}\right) $$ Flame Graph

policy_resolution_medium

Function Value Mean Flame graphs
resolve_policies_for_actor user: empty, selectivity: high, policies: 102 $$3.64 \mathrm{ms} \pm 18.2 \mathrm{μs}\left({\color{gray}1.59 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: low, policies: 1 $$2.81 \mathrm{ms} \pm 11.2 \mathrm{μs}\left({\color{gray}0.548 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: medium, policies: 51 $$3.17 \mathrm{ms} \pm 14.9 \mathrm{μs}\left({\color{gray}0.092 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: high, policies: 269 $$4.95 \mathrm{ms} \pm 21.6 \mathrm{μs}\left({\color{gray}0.498 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: low, policies: 1 $$3.38 \mathrm{ms} \pm 14.3 \mathrm{μs}\left({\color{gray}0.347 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: medium, policies: 107 $$3.92 \mathrm{ms} \pm 21.2 \mathrm{μs}\left({\color{gray}0.214 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: high, policies: 133 $$4.22 \mathrm{ms} \pm 23.4 \mathrm{μs}\left({\color{gray}-0.633 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: low, policies: 1 $$3.28 \mathrm{ms} \pm 17.6 \mathrm{μs}\left({\color{gray}2.18 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: medium, policies: 63 $$3.79 \mathrm{ms} \pm 19.4 \mathrm{μs}\left({\color{gray}-0.775 \mathrm{\%}}\right) $$ Flame Graph

policy_resolution_none

Function Value Mean Flame graphs
resolve_policies_for_actor user: empty, selectivity: high, policies: 2 $$2.55 \mathrm{ms} \pm 12.6 \mathrm{μs}\left({\color{red}8.23 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: low, policies: 1 $$2.45 \mathrm{ms} \pm 9.15 \mathrm{μs}\left({\color{red}6.42 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: medium, policies: 1 $$2.58 \mathrm{ms} \pm 11.1 \mathrm{μs}\left({\color{red}7.26 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: high, policies: 8 $$2.76 \mathrm{ms} \pm 15.9 \mathrm{μs}\left({\color{red}6.21 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: low, policies: 1 $$2.65 \mathrm{ms} \pm 11.7 \mathrm{μs}\left({\color{red}6.72 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: medium, policies: 3 $$2.84 \mathrm{ms} \pm 15.8 \mathrm{μs}\left({\color{red}6.84 \mathrm{\%}}\right) $$ Flame Graph

policy_resolution_small

Function Value Mean Flame graphs
resolve_policies_for_actor user: empty, selectivity: high, policies: 52 $$2.88 \mathrm{ms} \pm 11.6 \mathrm{μs}\left({\color{gray}4.67 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: low, policies: 1 $$2.59 \mathrm{ms} \pm 12.8 \mathrm{μs}\left({\color{red}8.10 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: medium, policies: 25 $$2.75 \mathrm{ms} \pm 11.6 \mathrm{μs}\left({\color{red}7.45 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: high, policies: 94 $$3.24 \mathrm{ms} \pm 16.4 \mathrm{μs}\left({\color{gray}4.95 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: low, policies: 1 $$2.81 \mathrm{ms} \pm 9.50 \mathrm{μs}\left({\color{red}6.26 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: medium, policies: 26 $$3.06 \mathrm{ms} \pm 15.1 \mathrm{μs}\left({\color{red}6.30 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: high, policies: 66 $$3.14 \mathrm{ms} \pm 16.7 \mathrm{μs}\left({\color{red}5.33 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: low, policies: 1 $$2.80 \mathrm{ms} \pm 13.4 \mathrm{μs}\left({\color{red}7.13 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: medium, policies: 29 $$3.03 \mathrm{ms} \pm 16.8 \mathrm{μs}\left({\color{red}5.80 \mathrm{\%}}\right) $$ Flame Graph

read_scaling_complete

Function Value Mean Flame graphs
entity_by_id;one_depth 1 entities $$38.7 \mathrm{ms} \pm 130 \mathrm{μs}\left({\color{gray}1.62 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;one_depth 10 entities $$76.4 \mathrm{ms} \pm 363 \mathrm{μs}\left({\color{gray}1.04 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;one_depth 25 entities $$43.6 \mathrm{ms} \pm 200 \mathrm{μs}\left({\color{gray}1.58 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;one_depth 5 entities $$45.6 \mathrm{ms} \pm 251 \mathrm{μs}\left({\color{gray}1.04 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;one_depth 50 entities $$53.1 \mathrm{ms} \pm 257 \mathrm{μs}\left({\color{gray}2.31 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 1 entities $$40.3 \mathrm{ms} \pm 160 \mathrm{μs}\left({\color{gray}2.12 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 10 entities $$418 \mathrm{ms} \pm 730 \mathrm{μs}\left({\color{gray}-1.148 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 25 entities $$95.0 \mathrm{ms} \pm 385 \mathrm{μs}\left({\color{gray}2.27 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 5 entities $$84.1 \mathrm{ms} \pm 320 \mathrm{μs}\left({\color{gray}-1.297 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 50 entities $$259 \mathrm{ms} \pm 565 \mathrm{μs}\left({\color{lightgreen}-6.329 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 1 entities $$14.6 \mathrm{ms} \pm 75.5 \mathrm{μs}\left({\color{gray}2.14 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 10 entities $$14.7 \mathrm{ms} \pm 71.0 \mathrm{μs}\left({\color{gray}1.93 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 25 entities $$14.9 \mathrm{ms} \pm 53.9 \mathrm{μs}\left({\color{gray}0.662 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 5 entities $$14.7 \mathrm{ms} \pm 58.5 \mathrm{μs}\left({\color{gray}1.27 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 50 entities $$17.3 \mathrm{ms} \pm 108 \mathrm{μs}\left({\color{gray}-1.437 \mathrm{\%}}\right) $$ Flame Graph

read_scaling_linkless

Function Value Mean Flame graphs
entity_by_id 1 entities $$14.4 \mathrm{ms} \pm 59.2 \mathrm{μs}\left({\color{gray}-1.724 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id 10 entities $$14.6 \mathrm{ms} \pm 61.3 \mathrm{μs}\left({\color{gray}1.93 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id 100 entities $$14.5 \mathrm{ms} \pm 66.0 \mathrm{μs}\left({\color{gray}1.10 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id 1000 entities $$15.1 \mathrm{ms} \pm 71.8 \mathrm{μs}\left({\color{gray}1.10 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id 10000 entities $$22.1 \mathrm{ms} \pm 154 \mathrm{μs}\left({\color{gray}1.31 \mathrm{\%}}\right) $$ Flame Graph

representative_read_entity

Function Value Mean Flame graphs
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/block/v/1 $$30.0 \mathrm{ms} \pm 228 \mathrm{μs}\left({\color{gray}1.76 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/book/v/1 $$29.3 \mathrm{ms} \pm 244 \mathrm{μs}\left({\color{gray}-1.073 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/building/v/1 $$29.3 \mathrm{ms} \pm 279 \mathrm{μs}\left({\color{gray}-1.460 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/organization/v/1 $$29.3 \mathrm{ms} \pm 254 \mathrm{μs}\left({\color{gray}-2.951 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/page/v/2 $$28.9 \mathrm{ms} \pm 271 \mathrm{μs}\left({\color{gray}-4.257 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/person/v/1 $$29.1 \mathrm{ms} \pm 303 \mathrm{μs}\left({\color{gray}1.44 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/playlist/v/1 $$29.2 \mathrm{ms} \pm 260 \mathrm{μs}\left({\color{gray}-2.204 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/song/v/1 $$29.3 \mathrm{ms} \pm 301 \mathrm{μs}\left({\color{gray}-1.284 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/uk-address/v/1 $$30.3 \mathrm{ms} \pm 290 \mathrm{μs}\left({\color{gray}1.91 \mathrm{\%}}\right) $$ Flame Graph

representative_read_entity_type

Function Value Mean Flame graphs
get_entity_type_by_id Account ID: bf5a9ef5-dc3b-43cf-a291-6210c0321eba $$8.06 \mathrm{ms} \pm 34.0 \mathrm{μs}\left({\color{gray}1.76 \mathrm{\%}}\right) $$ Flame Graph

representative_read_multiple_entities

Function Value Mean Flame graphs
entity_by_property traversal_paths=0 0 $$45.5 \mathrm{ms} \pm 231 \mathrm{μs}\left({\color{gray}-0.823 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=255 1,resolve_depths=inherit:1;values:255;properties:255;links:127;link_dests:126;type:true $$92.7 \mathrm{ms} \pm 358 \mathrm{μs}\left({\color{gray}-0.047 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:0;properties:0;links:0;link_dests:0;type:false $$51.1 \mathrm{ms} \pm 262 \mathrm{μs}\left({\color{gray}-1.254 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:0;properties:0;links:1;link_dests:0;type:true $$59.2 \mathrm{ms} \pm 440 \mathrm{μs}\left({\color{gray}-1.123 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:0;properties:2;links:1;link_dests:0;type:true $$67.2 \mathrm{ms} \pm 402 \mathrm{μs}\left({\color{gray}-0.601 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:2;properties:2;links:1;link_dests:0;type:true $$73.7 \mathrm{ms} \pm 352 \mathrm{μs}\left({\color{gray}-0.574 \mathrm{\%}}\right) $$
link_by_source_by_property traversal_paths=0 0 $$48.6 \mathrm{ms} \pm 234 \mathrm{μs}\left({\color{gray}-1.510 \mathrm{\%}}\right) $$
link_by_source_by_property traversal_paths=255 1,resolve_depths=inherit:1;values:255;properties:255;links:127;link_dests:126;type:true $$76.0 \mathrm{ms} \pm 438 \mathrm{μs}\left({\color{gray}0.100 \mathrm{\%}}\right) $$
link_by_source_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:0;properties:0;links:0;link_dests:0;type:false $$55.9 \mathrm{ms} \pm 269 \mathrm{μs}\left({\color{gray}-0.451 \mathrm{\%}}\right) $$
link_by_source_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:0;properties:0;links:1;link_dests:0;type:true $$62.8 \mathrm{ms} \pm 262 \mathrm{μs}\left({\color{gray}-0.756 \mathrm{\%}}\right) $$
link_by_source_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:0;properties:2;links:1;link_dests:0;type:true $$66.3 \mathrm{ms} \pm 491 \mathrm{μs}\left({\color{gray}0.448 \mathrm{\%}}\right) $$
link_by_source_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:2;properties:2;links:1;link_dests:0;type:true $$66.4 \mathrm{ms} \pm 336 \mathrm{μs}\left({\color{gray}1.23 \mathrm{\%}}\right) $$

scenarios

Function Value Mean Flame graphs
full_test query-limited $$140 \mathrm{ms} \pm 459 \mathrm{μs}\left({\color{red}5.32 \mathrm{\%}}\right) $$ Flame Graph
full_test query-unlimited $$137 \mathrm{ms} \pm 581 \mathrm{μs}\left({\color{gray}1.65 \mathrm{\%}}\right) $$ Flame Graph
linked_queries query-limited $$39.9 \mathrm{ms} \pm 189 \mathrm{μs}\left({\color{lightgreen}-61.444 \mathrm{\%}}\right) $$ Flame Graph
linked_queries query-unlimited $$582 \mathrm{ms} \pm 1.17 \mathrm{ms}\left({\color{gray}2.81 \mathrm{\%}}\right) $$ Flame Graph

@indietyp indietyp added this pull request to the merge queue Jan 15, 2026
Merged via the queue into main with commit 1892655 Jan 15, 2026
172 checks passed
@indietyp indietyp deleted the bm/be-254-experiment-around-with-codspeed branch January 15, 2026 10:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/deps Relates to third-party dependencies (area) area/infra Relates to version control, CI, CD or IaC (area) area/libs Relates to first-party libraries/crates/packages (area) type/eng > backend Owned by the @backend team

Development

Successfully merging this pull request may close these issues.

4 participants