perf(planning): build placement date keys directly
This commit is contained in:
1 parent
cbde23f572
commit
c7e7abcd24
2 files changed
+54
-4
No files matched your search
@@ -0,0 +1,53 @@
|
||||
# PR #278: build placement date keys directly
|
||||
|
||||
Measured on 2026-10-16, starting from PR #278 at `cbde23f`.
|
||||
|
||||
The unchanged benchmark finished in 299.372 seconds before this change, leaving
|
||||
only 0.628 seconds before its 300-second timeout. A separate loaded-year CPU
|
||||
profile attributed 8.27 of 66.57 seconds to `placementTieKey`, including its
|
||||
callees. That function runs when looking up cached calendar observations and
|
||||
when comparing final placement dates.
|
||||
|
||||
The one-line optimization sorts the placement map's date keys directly, using
|
||||
native string sorting. It removes the intermediate placement-to-date array and
|
||||
the comparison callback. Every placement map entry is keyed by its placement's
|
||||
date, and native string sorting preserves the existing lexical date order, so
|
||||
the resulting keys are identical. Search choices and scoring are unchanged.
|
||||
|
||||
## Before and after
|
||||
|
||||
Both runs used Node 24.18.0, Bun 1.3.14, Vitest 5.0.3, the same local machine,
|
||||
and the exact command below. No other test, build or profiling workload ran
|
||||
alongside either measurement.
|
||||
|
||||
```sh
|
||||
NODE_OPTIONS=--max-old-space-size=2048 timeout 300s bunx vitest run src/app/benchmark/leave-planner-benchmark.spec.ts --maxWorkers=1
|
||||
```
|
||||
|
||||
All seven warm-ups, fourteen measured calculations, the typed-obligation precheck,
|
||||
fixtures and assertions remain unchanged. Coverage is disabled for this command.
|
||||
|
||||
| Measurement | Before | After |
|
||||
| ---------------------------------------------- | --------: | --------: |
|
||||
| Entire command, external wall time | 299.372 s | 268.573 s |
|
||||
| Benchmark test | 293.620 s | 263.265 s |
|
||||
| Loaded year, mean of two measured calculations | 76.649 s | 67.747 s |
|
||||
| Headroom before timeout | 0.628 s | 31.427 s |
|
||||
|
||||
The entire command was 10.3% faster in this before-and-after pair. Both runs
|
||||
completed successfully, and every repeated scenario remained deterministic.
|
||||
These are local measurements; Gitea runner performance still needs confirmation.
|
||||
|
||||
## Correctness checks
|
||||
|
||||
Complete outcomes, stable explanations and final-state snapshots match the
|
||||
baseline for all seven scenarios. These separate comparisons ran alongside
|
||||
functional checks; their diagnostic timings are not used in the table above.
|
||||
|
||||
The functional coverage suite passes all 635 tests across 33 files. Application
|
||||
and spec type checks, lint, source formatting and `git diff --check` also pass.
|
||||
No browser timing run or live CI rerun was performed for this change.
|
||||
|
||||
The profiling runner and full protocol logs are retained in
|
||||
`/tmp/vac-opt278-measure`. The original diagnostic reproduction is documented in
|
||||
[issue-78.md](issue-78.md#reproduction).
|
||||
@@ -3317,10 +3317,7 @@ function preferenceStateKey(state: State): string {
|
||||
}
|
||||
|
||||
function placementTieKey(state: State): string {
|
||||
return [...state.placements.values()]
|
||||
.map((placement) => placement.date)
|
||||
.sort(compareDate)
|
||||
.join('|');
|
||||
return [...state.placements.keys()].sort().join('|');
|
||||
}
|
||||
|
||||
function expiryTieKey(state: State): string {
|
||||
|
||||
Reference in new issue
Block a user