返回 DeepSeek-Reasonix
pipeline_benchmark_test.go
根目录 / internal / turnevent / pipeline_benchmark_test.go
1 package turnevent_test
2
3 import (
4 "fmt"
5 "path/filepath"
6 "testing"
7
8 "reasonix/internal/event"
9 "reasonix/internal/turnevent"
10 )
11
12 type benchmarkLedgerSink struct {
13 ledger *turnevent.Ledger
14 projected int
15 }
16
17 func (s *benchmarkLedgerSink) Emit(e event.Event) { _ = s.EmitChecked(e) }
18
19 func (s *benchmarkLedgerSink) EmitChecked(e event.Event) error {
20 status := event.TurnInProgress
21 if e.Kind == event.TurnDone {
22 status = event.TurnCompleted
23 }
24 _, ok, err := s.ledger.Append(e, status)
25 if err == nil && ok {
26 s.projected++
27 }
28 return err
29 }
30
31 func BenchmarkCoalesceLedgerFrontend10000TextDeltas(b *testing.B) {
32 root := b.TempDir()
33 b.ReportAllocs()
34 b.ResetTimer()
35 for iteration := range b.N {
36 path := filepath.Join(root, fmt.Sprintf("text-%d.jsonl", iteration))
37 ledger, err := turnevent.Open(path, "benchmark")
38 if err != nil {
39 b.Fatal(err)
40 }
41 if _, err := ledger.Begin(); err != nil {
42 b.Fatal(err)
43 }
44 sink := &benchmarkLedgerSink{ledger: ledger}
45 stream := event.Coalesce(sink, event.DefaultStreamDeltaWindow)
46 for range 10_000 {
47 stream.Emit(event.Event{Kind: event.Text, Text: "x"})
48 }
49 if err := event.EmitChecked(stream, event.Event{Kind: event.TurnDone}); err != nil {
50 b.Fatal(err)
51 }
52 if sink.projected < 2 || sink.projected >= 10_000 {
53 b.Fatalf("projected records = %d, want coalesced stream plus terminal", sink.projected)
54 }
55 }
56 }
57
58 func BenchmarkLedger10000ToolProgressPersistentHandle(b *testing.B) {
59 root := b.TempDir()
60 b.ReportAllocs()
61 b.ResetTimer()
62 for iteration := range b.N {
63 path := filepath.Join(root, fmt.Sprintf("progress-%d.jsonl", iteration))
64 ledger, err := turnevent.Open(path, "benchmark")
65 if err != nil {
66 b.Fatal(err)
67 }
68 if _, err := ledger.Begin(); err != nil {
69 b.Fatal(err)
70 }
71 for i := range 10_000 {
72 if _, ok, err := ledger.Append(event.Event{Kind: event.ToolProgress, Tool: event.Tool{ID: "tool", Name: "bash", Output: "tick"}}, event.TurnInProgress); err != nil || !ok {
73 b.Fatalf("progress %d: ok=%v err=%v", i, ok, err)
74 }
75 }
76 if _, ok, err := ledger.Append(event.Event{Kind: event.TurnDone}, event.TurnCompleted); err != nil || !ok {
77 b.Fatalf("terminal: ok=%v err=%v", ok, err)
78 }
79 metrics := ledger.MetricsSnapshot()
80 if metrics.OpenCount != 1 || metrics.SyncCount != 1 || metrics.CloseCount != 1 {
81 b.Fatalf("WAL lifecycle = %d/%d/%d, want 1/1/1", metrics.OpenCount, metrics.SyncCount, metrics.CloseCount)
82 }
83 }
84 }
85
85 lines GO