Skip to content

Conversation

@indietyp
Copy link
Member

@indietyp indietyp commented Dec 28, 2025

🌟 What is the purpose of this PR?

Add Interned::empty() for zero-length slices and use IdProducer in InternMap

The previous version of this PR was about switching the allocator for interning, I found that there was no benefit to do so, hence another optimization: canonical empty slices (something that needed to be done either way for correctness) has been implemented. Giving a ~5-12% boost in places that mostly deal with empty collections, such as MIR passes.

🔍 What does this change?

  • Adds Interned::empty() method that returns a canonical empty interned slice
  • Replaces AtomicU32 with IdProducer<T::Id> in InternMap for ID generation
  • Initializes LocalLock instances with fast_hash_map() instead of using default()
  • Optimizes intern_slice to return the canonical empty slice for empty inputs
  • Adds a test for the stable empty slice functionality
  • Updates the test:miri script to include the new stable_empty_slice test

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:

  • do not affect the execution graph

🛡 What tests cover this?

  • Added a new test stable_empty_slice to verify that empty slices share the same address
  • Existing tests cover the IdProducer changes

❓ How to test this?

  1. Run cargo test to verify all tests pass
  2. Run cargo miri nextest run -- stable_empty_slice to verify the new empty slice functionality
  3. Verify that interning empty slices returns the same reference regardless of element type

@vercel vercel bot temporarily deployed to Preview – petrinaut December 28, 2025 10:27 Inactive
@cursor
Copy link

cursor bot commented Dec 28, 2025

PR Summary

Introduces canonical empty slices and streamlines ID generation and map initialization.

  • Adds Interned::empty() returning a canonical empty interned slice; uses it in InternSet::intern_slice for empty inputs
  • Replaces AtomicU32 with IdProducer<T::Id> in InternMap and updates next_id() implementation
  • Initializes LocalLock maps with fast_hash_map() (and fast_hash_map_with_capacity in with_capacity) instead of default()
  • Adds test stable_empty_slice validating shared address across empty slice types; updates test:miri script to include it

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

@codecov
Copy link

codecov bot commented Dec 28, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 60.04%. Comparing base (28d00a6) to head (75ba45f).

Additional details and impacted files
@@                                           Coverage Diff                                            @@
##           bm/be-260-hashql-switch-internal-allocator-implementation-to-scoping    #8223      +/-   ##
========================================================================================================
+ Coverage                                                                 60.02%   60.04%   +0.01%     
========================================================================================================
  Files                                                                      1054     1054              
  Lines                                                                    106560   106576      +16     
  Branches                                                                   4433     4434       +1     
========================================================================================================
+ Hits                                                                      63965    63989      +24     
+ Misses                                                                    41873    41865       -8     
  Partials                                                                    722      722              
Flag Coverage Δ
apps.hash-ai-worker-ts 1.40% <ø> (ø)
apps.hash-api 0.00% <ø> (ø)
local.hash-graph-sdk 10.88% <ø> (ø)
local.hash-isomorphic-utils 0.00% <ø> (ø)
rust.hash-graph-api 2.89% <ø> (ø)
rust.hashql-ast 87.25% <ø> (ø)
rust.hashql-compiletest 46.65% <ø> (ø)
rust.hashql-core 81.92% <100.00%> (+0.04%) ⬆️
rust.hashql-eval 68.54% <ø> (ø)
rust.hashql-hir 89.10% <ø> (ø)
rust.hashql-mir 88.51% <ø> (ø)
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 28, 2025

CodSpeed Performance Report

Merging #8223 will improve performance by 12.05%

Comparing bm/be-262-hashql-use-heap-to-store-interners (75ba45f) with bm/be-260-hashql-switch-internal-allocator-implementation-to-scoping (28d00a6)

Summary

⚡ 1 improvement
✅ 28 untouched

Benchmarks breakdown

Benchmark BASE HEAD Efficiency
diamond 7.1 µs 6.3 µs +12.05%

@augmentcode
Copy link

augmentcode bot commented Dec 28, 2025

🤖 Augment PR Summary

Summary: Refactors HashQL interning collections to allocate their backing hash tables in the arena Heap and to centralize sequential ID generation.

Changes:

  • InternMap: replace the manual AtomicU32 counter with IdProducer<T::Id> and generate IDs via IdProducer::next()
  • InternMap: build inner/lookup via fast_hash_map_in / fast_hash_map_with_capacity_in, and carry &Heap as the map allocator parameter
  • InternSet: allocate the internal map via the same *_in helpers and update the map type to include the allocator parameter

Technical Notes: This keeps hash map bucket allocations scoped to the Heap lifetime and removes duplicated atomic counter logic in favor of the shared ID utility.

🤖 Was this summary useful? React with 👍 or 👎

Copy link

@augmentcode augmentcode bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review completed. No suggestions at this time.

Comment augment review to trigger a new review at any time.

@indietyp indietyp force-pushed the bm/be-262-hashql-use-heap-to-store-interners branch from 93ccc9e to e14f024 Compare December 28, 2025 11:17
@indietyp indietyp force-pushed the bm/be-260-hashql-switch-internal-allocator-implementation-to-scoping branch from a7e9d27 to 6580280 Compare December 28, 2025 11:17
@vercel vercel bot temporarily deployed to Preview – petrinaut December 28, 2025 11:18 Inactive
@indietyp indietyp force-pushed the bm/be-262-hashql-use-heap-to-store-interners branch from e14f024 to c3d8d0f Compare December 28, 2025 11:31
@vercel vercel bot temporarily deployed to Preview – petrinaut December 28, 2025 11:31 Inactive
@indietyp indietyp changed the title BE-262: HashQL: Use heap allocator for InternMap and InternSet collections BE-262: HashQL: Do not intern empty collections Dec 28, 2025
@indietyp indietyp changed the title BE-262: HashQL: Do not intern empty collections BE-262: HashQL: Do not intern empty slices Dec 28, 2025
@graphite-app graphite-app bot requested review from a team December 28, 2025 12:56
@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 $$27.3 \mathrm{ms} \pm 123 \mathrm{μs}\left({\color{gray}-3.157 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: low, policies: 1 $$3.31 \mathrm{ms} \pm 14.6 \mathrm{μs}\left({\color{gray}-0.455 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: medium, policies: 1001 $$12.3 \mathrm{ms} \pm 85.8 \mathrm{μs}\left({\color{lightgreen}-5.341 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: high, policies: 3314 $$41.9 \mathrm{ms} \pm 325 \mathrm{μs}\left({\color{gray}-2.037 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: low, policies: 1 $$13.9 \mathrm{ms} \pm 78.9 \mathrm{μs}\left({\color{gray}-2.669 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: medium, policies: 1526 $$23.8 \mathrm{ms} \pm 168 \mathrm{μs}\left({\color{gray}-3.204 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: high, policies: 2078 $$24.1 \mathrm{ms} \pm 136 \mathrm{μs}\left({\color{lightgreen}-47.017 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: low, policies: 1 $$5.16 \mathrm{ms} \pm 34.2 \mathrm{μs}\left({\color{lightgreen}-74.989 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: medium, policies: 1033 $$15.9 \mathrm{ms} \pm 113 \mathrm{μs}\left({\color{lightgreen}-49.969 \mathrm{\%}}\right) $$ Flame Graph

policy_resolution_medium

Function Value Mean Flame graphs
resolve_policies_for_actor user: empty, selectivity: high, policies: 102 $$3.66 \mathrm{ms} \pm 17.2 \mathrm{μs}\left({\color{gray}-0.805 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: low, policies: 1 $$2.90 \mathrm{ms} \pm 19.3 \mathrm{μs}\left({\color{gray}-0.250 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: medium, policies: 51 $$3.25 \mathrm{ms} \pm 15.0 \mathrm{μs}\left({\color{gray}-0.675 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: high, policies: 269 $$5.04 \mathrm{ms} \pm 24.5 \mathrm{μs}\left({\color{gray}-2.325 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: low, policies: 1 $$3.43 \mathrm{ms} \pm 15.7 \mathrm{μs}\left({\color{gray}-1.436 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: medium, policies: 107 $$3.97 \mathrm{ms} \pm 19.2 \mathrm{μs}\left({\color{gray}-2.806 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: high, policies: 133 $$4.33 \mathrm{ms} \pm 25.8 \mathrm{μs}\left({\color{gray}0.368 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: low, policies: 1 $$3.30 \mathrm{ms} \pm 12.8 \mathrm{μs}\left({\color{gray}-1.550 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: medium, policies: 63 $$3.88 \mathrm{ms} \pm 19.1 \mathrm{μs}\left({\color{gray}-2.703 \mathrm{\%}}\right) $$ Flame Graph

policy_resolution_none

Function Value Mean Flame graphs
resolve_policies_for_actor user: empty, selectivity: high, policies: 2 $$2.58 \mathrm{ms} \pm 10.6 \mathrm{μs}\left({\color{red}5.49 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: low, policies: 1 $$2.51 \mathrm{ms} \pm 11.6 \mathrm{μs}\left({\color{red}5.10 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: medium, policies: 1 $$2.66 \mathrm{ms} \pm 12.2 \mathrm{μs}\left({\color{red}7.19 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: high, policies: 8 $$2.82 \mathrm{ms} \pm 16.3 \mathrm{μs}\left({\color{red}5.08 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: low, policies: 1 $$2.72 \mathrm{ms} \pm 14.8 \mathrm{μs}\left({\color{gray}4.20 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: medium, policies: 3 $$2.88 \mathrm{ms} \pm 12.7 \mathrm{μs}\left({\color{gray}2.98 \mathrm{\%}}\right) $$ Flame Graph

policy_resolution_small

Function Value Mean Flame graphs
resolve_policies_for_actor user: empty, selectivity: high, policies: 52 $$2.95 \mathrm{ms} \pm 14.3 \mathrm{μs}\left({\color{gray}4.27 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: low, policies: 1 $$2.65 \mathrm{ms} \pm 16.0 \mathrm{μs}\left({\color{red}6.35 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: medium, policies: 25 $$2.83 \mathrm{ms} \pm 14.3 \mathrm{μs}\left({\color{red}7.02 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: high, policies: 94 $$3.32 \mathrm{ms} \pm 17.4 \mathrm{μs}\left({\color{red}5.71 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: low, policies: 1 $$2.86 \mathrm{ms} \pm 12.1 \mathrm{μs}\left({\color{red}5.48 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: medium, policies: 26 $$3.16 \mathrm{ms} \pm 17.7 \mathrm{μs}\left({\color{red}7.69 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: high, policies: 66 $$3.22 \mathrm{ms} \pm 18.3 \mathrm{μs}\left({\color{red}5.28 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: low, policies: 1 $$2.83 \mathrm{ms} \pm 14.9 \mathrm{μs}\left({\color{gray}3.91 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: medium, policies: 29 $$3.08 \mathrm{ms} \pm 15.5 \mathrm{μs}\left({\color{red}5.83 \mathrm{\%}}\right) $$ Flame Graph

read_scaling_complete

Function Value Mean Flame graphs
entity_by_id;one_depth 1 entities $$39.3 \mathrm{ms} \pm 147 \mathrm{μs}\left({\color{gray}-2.863 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;one_depth 10 entities $$77.6 \mathrm{ms} \pm 406 \mathrm{μs}\left({\color{gray}-0.126 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;one_depth 25 entities $$44.8 \mathrm{ms} \pm 208 \mathrm{μs}\left({\color{gray}1.46 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;one_depth 5 entities $$47.3 \mathrm{ms} \pm 303 \mathrm{μs}\left({\color{gray}0.380 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;one_depth 50 entities $$55.0 \mathrm{ms} \pm 341 \mathrm{μs}\left({\color{gray}0.290 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 1 entities $$41.1 \mathrm{ms} \pm 197 \mathrm{μs}\left({\color{gray}-1.259 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 10 entities $$413 \mathrm{ms} \pm 913 \mathrm{μs}\left({\color{gray}-1.779 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 25 entities $$98.5 \mathrm{ms} \pm 403 \mathrm{μs}\left({\color{gray}-0.395 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 5 entities $$85.3 \mathrm{ms} \pm 348 \mathrm{μs}\left({\color{gray}-0.929 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 50 entities $$288 \mathrm{ms} \pm 858 \mathrm{μs}\left({\color{gray}0.531 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 1 entities $$15.2 \mathrm{ms} \pm 71.2 \mathrm{μs}\left({\color{gray}1.73 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 10 entities $$15.4 \mathrm{ms} \pm 86.0 \mathrm{μs}\left({\color{gray}1.86 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 25 entities $$15.8 \mathrm{ms} \pm 92.7 \mathrm{μs}\left({\color{gray}0.783 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 5 entities $$15.4 \mathrm{ms} \pm 62.2 \mathrm{μs}\left({\color{gray}0.839 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 50 entities $$18.6 \mathrm{ms} \pm 108 \mathrm{μs}\left({\color{gray}3.93 \mathrm{\%}}\right) $$ Flame Graph

read_scaling_linkless

Function Value Mean Flame graphs
entity_by_id 1 entities $$15.5 \mathrm{ms} \pm 92.5 \mathrm{μs}\left({\color{gray}2.35 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id 10 entities $$15.7 \mathrm{ms} \pm 69.8 \mathrm{μs}\left({\color{gray}4.21 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id 100 entities $$15.6 \mathrm{ms} \pm 86.2 \mathrm{μs}\left({\color{gray}3.35 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id 1000 entities $$15.7 \mathrm{ms} \pm 79.2 \mathrm{μs}\left({\color{gray}-0.009 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id 10000 entities $$22.8 \mathrm{ms} \pm 138 \mathrm{μs}\left({\color{gray}-2.396 \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.1 \mathrm{ms} \pm 329 \mathrm{μs}\left({\color{gray}-0.863 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/book/v/1 $$31.3 \mathrm{ms} \pm 324 \mathrm{μs}\left({\color{gray}1.10 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/building/v/1 $$30.9 \mathrm{ms} \pm 317 \mathrm{μs}\left({\color{gray}1.81 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/organization/v/1 $$30.2 \mathrm{ms} \pm 278 \mathrm{μs}\left({\color{gray}-2.884 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/page/v/2 $$29.8 \mathrm{ms} \pm 292 \mathrm{μs}\left({\color{gray}-0.566 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/person/v/1 $$30.4 \mathrm{ms} \pm 266 \mathrm{μs}\left({\color{gray}2.54 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/playlist/v/1 $$30.4 \mathrm{ms} \pm 308 \mathrm{μs}\left({\color{lightgreen}-5.185 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/song/v/1 $$30.8 \mathrm{ms} \pm 272 \mathrm{μs}\left({\color{gray}-1.173 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/uk-address/v/1 $$29.8 \mathrm{ms} \pm 324 \mathrm{μs}\left({\color{gray}-1.905 \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.26 \mathrm{ms} \pm 38.6 \mathrm{μs}\left({\color{gray}-0.722 \mathrm{\%}}\right) $$ Flame Graph

representative_read_multiple_entities

Function Value Mean Flame graphs
entity_by_property traversal_paths=0 0 $$47.3 \mathrm{ms} \pm 220 \mathrm{μs}\left({\color{gray}-1.462 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=255 1,resolve_depths=inherit:1;values:255;properties:255;links:127;link_dests:126;type:true $$95.7 \mathrm{ms} \pm 375 \mathrm{μs}\left({\color{gray}-1.547 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:0;properties:0;links:0;link_dests:0;type:false $$53.2 \mathrm{ms} \pm 289 \mathrm{μs}\left({\color{gray}-2.549 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:0;properties:0;links:1;link_dests:0;type:true $$61.2 \mathrm{ms} \pm 367 \mathrm{μs}\left({\color{gray}-2.668 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:0;properties:2;links:1;link_dests:0;type:true $$69.1 \mathrm{ms} \pm 334 \mathrm{μs}\left({\color{gray}-3.228 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:2;properties:2;links:1;link_dests:0;type:true $$77.0 \mathrm{ms} \pm 307 \mathrm{μs}\left({\color{gray}-1.448 \mathrm{\%}}\right) $$
link_by_source_by_property traversal_paths=0 0 $$49.7 \mathrm{ms} \pm 256 \mathrm{μs}\left({\color{gray}-3.718 \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 $$79.8 \mathrm{ms} \pm 361 \mathrm{μs}\left({\color{gray}-0.505 \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 $$57.6 \mathrm{ms} \pm 278 \mathrm{μs}\left({\color{gray}-3.108 \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 $$64.9 \mathrm{ms} \pm 300 \mathrm{μs}\left({\color{gray}-4.370 \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 $$67.6 \mathrm{ms} \pm 377 \mathrm{μs}\left({\color{gray}-1.118 \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 $$67.7 \mathrm{ms} \pm 308 \mathrm{μs}\left({\color{gray}1.11 \mathrm{\%}}\right) $$

scenarios

Function Value Mean Flame graphs
full_test query-limited $$136 \mathrm{ms} \pm 494 \mathrm{μs}\left({\color{gray}-1.856 \mathrm{\%}}\right) $$ Flame Graph
full_test query-unlimited $$135 \mathrm{ms} \pm 540 \mathrm{μs}\left({\color{gray}-2.129 \mathrm{\%}}\right) $$ Flame Graph
linked_queries query-limited $$40.0 \mathrm{ms} \pm 189 \mathrm{μs}\left({\color{lightgreen}-61.447 \mathrm{\%}}\right) $$ Flame Graph
linked_queries query-unlimited $$587 \mathrm{ms} \pm 1.11 \mathrm{ms}\left({\color{gray}1.07 \mathrm{\%}}\right) $$ Flame Graph

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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.

2 participants