Skip to content

Build before/after(:all) prefixes once per group in the TimeTracker#346

Open
connorshea wants to merge 2 commits into
KnapsackPro:mainfrom
connorshea:perf/add-hooks-time
Open

Build before/after(:all) prefixes once per group in the TimeTracker#346
connorshea wants to merge 2 commits into
KnapsackPro:mainfrom
connorshea:perf/add-hooks-time

Conversation

@connorshea

Copy link
Copy Markdown

Description

AI Disclosure: This was generated using Claude Code with Opus 5. It has been tested and reviewed by me.

add_hooks_time re-derived the same group_id_path[0..-2] string for every (example, group) pair, and reduce over a hash allocates an array per pair. This PR builds the prefixes once per group and sums with each.

For 500 test files with 40 examples and 8 groups each: 356k allocations / 20.7 ms -> 9k / 8.8 ms.

Though it should be noted that this only happens when the split-by-example mode is enabled and actually gets used (when the Knapsack API marks a file as slow), and the benchmark is inherently unrealistic to show the scale of the change. In most test suites, this likely will not have much or any impact. If this change doesn't feel worth it due to the lack of impact for most users, it'd be fine with me to close it.

Checks

  • I added the changes to the UNRELEASED section of the CHANGELOG.md, including the needed bump (i.e., patch, minor, major)
  • I followed the architecture outlined below for RSpec in Queue Mode:
    • Pure: lib/knapsack_pro/pure/queue/rspec_pure.rb contains pure functions that are unit tested.
    • Extension: lib/knapsack_pro/extensions/rspec_extension.rb encapsulates calls to RSpec internals and is integration and E2E tested.
    • Runner: lib/knapsack_pro/runners/queue/rspec_runner.rb invokes the pure code and the extension to produce side effects, which are integration and E2E tested.

connorshea and others added 2 commits July 25, 2026 09:37
…cker

`add_hooks_time` re-derived the same `group_id_path[0..-2]` string for
every (example, group) pair, and `reduce` over a hash allocates an array
per pair. Build the prefixes once per group and sum with `each`.

For 500 test files with 40 examples and 8 groups each: 356k allocations
/ 20.7 ms -> 9k / 8.8 ms.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Merging the two `start_with?` checks into a single `if` left the two
explanatory comments stacked above it, so neither one pointed at the
branch it describes. Split them back apart with `next`, which also keeps
the method's shape closer to what it replaced.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant