86 lines
3.1 KiB
TypeScript
86 lines
3.1 KiB
TypeScript
import { benchmark, benchmarkDiagnostics, expect } from "../benchmark"
|
|
import {
|
|
buildInitialStreamEvent,
|
|
buildStreamDeltaEvents,
|
|
setupTimelineBenchmark,
|
|
textPartID,
|
|
} from "./session-timeline-benchmark.fixture"
|
|
import { startTimelineProfile } from "./session-timeline-profile"
|
|
import {
|
|
collectTimelineStreamMetrics,
|
|
installTimelineStreamProbe,
|
|
startTimelineStreamProbe,
|
|
} from "./session-timeline-stream-probe"
|
|
|
|
benchmark.describe("performance: session timeline streaming", () => {
|
|
benchmark("streams assistant text without remounting or oscillating", async ({ page, report }) => {
|
|
benchmark.setTimeout(480_000)
|
|
const cpuThrottle = Number(process.env.TIMELINE_CPU_THROTTLE ?? 30)
|
|
const deltaCount = Number(process.env.TIMELINE_DELTA_COUNT ?? 160)
|
|
const historyTurns = Number(process.env.TIMELINE_HISTORY_TURNS ?? 320)
|
|
const eventBatch = Number(process.env.TIMELINE_EVENT_BATCH ?? 1)
|
|
const minimal = process.env.TIMELINE_MINIMAL === "1"
|
|
const profileCPU = process.env.TIMELINE_CPU_PROFILE === "1"
|
|
const profileVisual = !minimal && profileCPU && process.env.TIMELINE_VISUAL_PROFILE !== "0"
|
|
const fixture = await setupTimelineBenchmark(page, {
|
|
historyTurns,
|
|
eventBatch,
|
|
})
|
|
|
|
fixture.transport.enqueue(buildInitialStreamEvent(deltaCount))
|
|
const contentStart = performance.now()
|
|
await expect(fixture.text).toBeVisible()
|
|
await expect(fixture.text).toContainText("Implementation plan")
|
|
const initialContentObservedMs = performance.now() - contentStart
|
|
await fixture.scrollToBottom()
|
|
await fixture.waitForStableGeometry()
|
|
|
|
const profile = await startTimelineProfile(page, { cpuThrottle, profileCPU })
|
|
await installTimelineStreamProbe(page, { textPartID, finalIndex: deltaCount, profileVisual, minimal })
|
|
const deltas = buildStreamDeltaEvents(deltaCount)
|
|
await startTimelineStreamProbe(page)
|
|
fixture.transport.enqueue(deltas)
|
|
|
|
await page.waitForFunction(
|
|
(finalIndex) =>
|
|
(
|
|
window as Window & {
|
|
__timelineStreamBenchmark?: { applied: { index: number }[] }
|
|
}
|
|
).__timelineStreamBenchmark?.applied.some((value) => value.index === finalIndex),
|
|
deltaCount,
|
|
{ timeout: 420_000 },
|
|
)
|
|
await expect(fixture.text).toContainText("benchmark-complete")
|
|
await expect(fixture.text).toContainText("Streaming")
|
|
await fixture.waitForStableGeometry()
|
|
const metrics = await collectTimelineStreamMetrics(page, {
|
|
textPartID,
|
|
finalIndex: deltaCount,
|
|
navigations: benchmarkDiagnostics(page).navigations,
|
|
})
|
|
const delivered = deltas.length - fixture.transport.pendingCount()
|
|
await profile.stop()
|
|
|
|
report(
|
|
{
|
|
endToEndInitialContentObservedMs: initialContentObservedMs,
|
|
...metrics,
|
|
deliveredDeltas: delivered,
|
|
pendingDeltas: fixture.transport.pendingCount(),
|
|
},
|
|
{
|
|
cpuThrottle,
|
|
profileCPU,
|
|
profileVisual,
|
|
minimal,
|
|
queuedDeltas: deltas.length,
|
|
historyTurns,
|
|
eventBatch,
|
|
},
|
|
)
|
|
|
|
await profile.reset()
|
|
})
|
|
})
|