test(daemon): include fixture setup in benchmark calibration
- commit
- a925684351372157ea88050536be6c906f60e256
- author
- brice · · 2026-07-24 04:46 UTC
- parent
- 7538f61
- signature
- GPG Verified
CD88F9E564E0102646FB6077A1A07C7C7C3E349D· arch-gpg Verified for the committer email
1 file · +8 -7
M internal/usecase/daemon/performance_benchmark_test.go +8 -7
| @@ -540,15 +540,16 @@ func benchmarkIncrementalSnapshotRepository(b *testing.B, scenario snapshotBench | |||
| 540 | 540 | b.ResetTimer() | |
| 541 | 541 | for operation := 0; b.Loop(); operation++ { | |
| 542 | 542 | func() { | |
| 543 | - | // A new fixture is deliberately outside the timed region. It gives every | |
| 544 | - | // iteration the same filesystem state: initial has no generation, | |
| 545 | - | // unchanged/visible/tail/sealed begin after one persisted generation. | |
| 546 | - | // Reusing one fixture would eventually turn a tail into a sealed chunk | |
| 547 | - | // and dilute initial-write bytes over later idempotent publications. | |
| 548 | - | b.StopTimer() | |
| 543 | + | // A new fixture gives every iteration the same filesystem state: initial | |
| 544 | + | // has no generation, while changed scenarios begin after one persisted | |
| 545 | + | // generation. Keep its expensive 10k-row construction timed so benchmark | |
| 546 | + | // calibration accounts for real wall time instead of scheduling thousands | |
| 547 | + | // of hidden setup iterations. | |
| 548 | + | // | |
| 549 | 549 | // b.Cleanup retains callbacks until the sub-benchmark ends; deferring an | |
| 550 | - | // explicit close avoids retaining every 10k-row fixture and OOM. | |
| 550 | + | // explicit close avoids retaining every fixture and OOM. | |
| 551 | 551 | fixture := newPerformanceFixtureWithCleanup(b, performanceConfig{size: scenario.size, panes: 1, historyRows: scenario.historyRows}, false) | |
| 552 | + | b.StopTimer() | |
| 552 | 553 | defer func() { | |
| 553 | 554 | b.StopTimer() | |
| 554 | 555 | if err := fixture.close(); err != nil { | |
| @@ -540,15 +540,16 @@ func benchmarkIncrementalSnapshotRepository(b *testing.B, scenario snapshotBench | |||||
| 540 | b.ResetTimer() | 540 | b.ResetTimer() | ||
| 541 | for operation := 0; b.Loop(); operation++ { | 541 | for operation := 0; b.Loop(); operation++ { | ||
| 542 | func() { | 542 | func() { | ||
| 543 | - | // A new fixture is deliberately outside the timed region. It gives every | 543 | + | // A new fixture gives every iteration the same filesystem state: initial |
| 544 | - | // iteration the same filesystem state: initial has no generation, | 544 | + | // has no generation, while changed scenarios begin after one persisted |
| 545 | - | // unchanged/visible/tail/sealed begin after one persisted generation. | 545 | + | // generation. Keep its expensive 10k-row construction timed so benchmark |
| 546 | - | // Reusing one fixture would eventually turn a tail into a sealed chunk | 546 | + | // calibration accounts for real wall time instead of scheduling thousands |
| 547 | - | // and dilute initial-write bytes over later idempotent publications. | 547 | + | // of hidden setup iterations. |
| 548 | - | b.StopTimer() | 548 | + | // |
| 549 | // b.Cleanup retains callbacks until the sub-benchmark ends; deferring an | 549 | // b.Cleanup retains callbacks until the sub-benchmark ends; deferring an | ||
| 550 | - | // explicit close avoids retaining every 10k-row fixture and OOM. | 550 | + | // explicit close avoids retaining every fixture and OOM. |
| 551 | fixture := newPerformanceFixtureWithCleanup(b, performanceConfig{size: scenario.size, panes: 1, historyRows: scenario.historyRows}, false) | 551 | fixture := newPerformanceFixtureWithCleanup(b, performanceConfig{size: scenario.size, panes: 1, historyRows: scenario.historyRows}, false) | ||
| 552 | + | b.StopTimer() | |||
| 552 | defer func() { | 553 | defer func() { | ||
| 553 | b.StopTimer() | 554 | b.StopTimer() | ||
| 554 | if err := fixture.close(); err != nil { | 555 | if err := fixture.close(); err != nil { | ||