mirror of
https://github.com/stablyai/orca.git
synced 2026-10-17 00:03:08 +00:00
Findings + tests: batch windows were the DSR-load gap (19->8.0ms dev); timing tests updated to 2ms windows
Co-authored-by: Orca <help@stably.ai>
This commit is contained in:
@@ -537,6 +537,30 @@ drain scheduling (sub-ms re-arm; also raises the throughput ceiling);
|
||||
(2) tighter effective in-flight window on the renderer delivery path.
|
||||
Target: VS Code's ~7ms class or below without giving back throughput.
|
||||
|
||||
### 2026-07-03 — Batch windows were the gap: dev DSR-load p50 19 -> 8.0ms
|
||||
|
||||
Lever results (dev, 3MB protocol, same session):
|
||||
- MessageChannel drains (2434dfaae): 19.01ms — NO change. Proved the
|
||||
~19ms was NOT queue depth: at 1MB/s vs ~11MB/s capacity (9% util)
|
||||
there is no standing queue. Kept (correct, removes a real clamp).
|
||||
- Batch windows 8->2ms on BOTH hops (e67a91d7a: daemon
|
||||
STREAM_DATA_BATCH_INTERVAL_MS + main PTY_BATCH_INTERVAL_MS):
|
||||
**p50 8.00 / p90 10.13 / p99 12.26ms** (from 19.01/22.7/28.1).
|
||||
Throughput unchanged (agent-tui 9.8 vs 9.1, ambient noise). 239
|
||||
batcher+pty tests green after timing updates.
|
||||
|
||||
Dev-mode 8.0ms already matches VS Code prod (7.18); prod build should
|
||||
land BELOW VS Code. p99: ours 12.3 vs VS Code 43.4. The remaining
|
||||
fixed-latency terms are renderer/xterm-internal (12ms parse slices).
|
||||
Note: main's interactive bypass (input-gated) means real keystroke echo
|
||||
skips batching entirely — the DSR metric understates real typing
|
||||
responsiveness; VS Code measured on the same freight path, comparison
|
||||
fair.
|
||||
|
||||
Next: cut RC, confirm in prod, re-baseline vs Terminal.app (expect
|
||||
~8-15x from 300x at baseline; goal line 10x = 4.5ms now plausibly in
|
||||
reach).
|
||||
|
||||
## Success criteria (baseline-relative; finalize after task 1)
|
||||
|
||||
- DSR-under-load p90 in Orca within striking distance of iTerm2 on the same
|
||||
|
||||
@@ -22,7 +22,7 @@ describe('DaemonStreamDataBatcher', () => {
|
||||
batcher.enqueue('client-1', 'session-1', 'b')
|
||||
|
||||
expect(streamSocket.write).not.toHaveBeenCalled()
|
||||
vi.advanceTimersByTime(7)
|
||||
vi.advanceTimersByTime(1)
|
||||
expect(streamSocket.write).not.toHaveBeenCalled()
|
||||
vi.advanceTimersByTime(1)
|
||||
|
||||
@@ -45,7 +45,7 @@ describe('DaemonStreamDataBatcher', () => {
|
||||
|
||||
expect(streamSocket.write).toHaveBeenCalledTimes(1)
|
||||
expect(String(streamSocket.write.mock.calls[0]?.[0])).toContain('\\u001b[20;2Hredraw')
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
expect(streamSocket.write).toHaveBeenCalledTimes(1)
|
||||
} finally {
|
||||
vi.useRealTimers()
|
||||
@@ -65,7 +65,7 @@ describe('DaemonStreamDataBatcher', () => {
|
||||
})
|
||||
|
||||
expect(streamSocket.write).not.toHaveBeenCalled()
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
expect(streamSocket.write).toHaveBeenCalledTimes(1)
|
||||
expect(String(streamSocket.write.mock.calls[0]?.[0])).toContain(`${pending}redraw`)
|
||||
} finally {
|
||||
@@ -91,7 +91,7 @@ describe('DaemonStreamDataBatcher', () => {
|
||||
)
|
||||
expect(String(streamSocket.write.mock.calls[0]?.[0])).toContain('"data":"echo"')
|
||||
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
expect(streamSocket.write).toHaveBeenCalledTimes(2)
|
||||
expect(String(streamSocket.write.mock.calls[1]?.[0])).toContain(
|
||||
'"sessionId":"session-background"'
|
||||
@@ -113,7 +113,7 @@ describe('DaemonStreamDataBatcher', () => {
|
||||
const parser = createNdjsonParser(onMessage, onError, { maxLineBytes })
|
||||
|
||||
batcher.enqueue('client-1', 'session-1', data)
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
for (const [line] of streamSocket.write.mock.calls) {
|
||||
parser.feed(String(line))
|
||||
}
|
||||
|
||||
+46
-46
@@ -3248,7 +3248,7 @@ describe('registerPtyHandlers', () => {
|
||||
const result = await pendingSpawn
|
||||
|
||||
daemon.emitData(result.id, 'daemon output')
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
daemon.emitExit(result.id, 0)
|
||||
|
||||
expect(daemon.spawn).toHaveBeenCalledTimes(1)
|
||||
@@ -6292,7 +6292,7 @@ describe('registerPtyHandlers', () => {
|
||||
mockProc.emitData('background output')
|
||||
|
||||
expect(mainWindow.webContents.send).not.toHaveBeenCalled()
|
||||
vi.advanceTimersByTime(7)
|
||||
vi.advanceTimersByTime(1)
|
||||
expect(mainWindow.webContents.send).not.toHaveBeenCalled()
|
||||
vi.advanceTimersByTime(1)
|
||||
expect(mainWindow.webContents.send).toHaveBeenCalledWith('pty:data', {
|
||||
@@ -6321,7 +6321,7 @@ describe('registerPtyHandlers', () => {
|
||||
|
||||
setRendererPtyVisible(null, { id: spawnResult.id, visible: true })
|
||||
mockProc.emitData('visible output')
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
expect(mainWindow.webContents.send).toHaveBeenCalledWith('pty:data', {
|
||||
id: spawnResult.id,
|
||||
data: 'visible output'
|
||||
@@ -6331,7 +6331,7 @@ describe('registerPtyHandlers', () => {
|
||||
setRendererPtyVisible(null, { id: spawnResult.id, visible: false })
|
||||
mockProc.emitData('\x1b[2Khidden-width redraw')
|
||||
setRendererPtyVisible(null, { id: spawnResult.id, visible: true })
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
|
||||
expect(mainWindow.webContents.send).toHaveBeenCalledWith('pty:data', {
|
||||
id: spawnResult.id,
|
||||
@@ -6362,7 +6362,7 @@ describe('registerPtyHandlers', () => {
|
||||
setRendererPtyVisible(null, { id: spawnResult.id, visible: true })
|
||||
handleRendererLoading()
|
||||
mockProc.emitData('reload-gap output')
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
|
||||
expect(mainWindow.webContents.send).toHaveBeenCalledWith('pty:data', {
|
||||
id: spawnResult.id,
|
||||
@@ -6373,7 +6373,7 @@ describe('registerPtyHandlers', () => {
|
||||
mainWindow.webContents.send.mockClear()
|
||||
setRendererPtyVisible(null, { id: spawnResult.id, visible: true })
|
||||
mockProc.emitData('visible output')
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
|
||||
expect(mainWindow.webContents.send).toHaveBeenCalledWith('pty:data', {
|
||||
id: spawnResult.id,
|
||||
@@ -6404,7 +6404,7 @@ describe('registerPtyHandlers', () => {
|
||||
resizePty(null, { id: spawnResult.id, cols: 72, rows: 24 })
|
||||
setRendererPtyVisible(null, { id: spawnResult.id, visible: true })
|
||||
mockProc.emitData('\x1b[2Khidden-resize redraw')
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
|
||||
expect(mainWindow.webContents.send).toHaveBeenCalledWith('pty:data', {
|
||||
id: spawnResult.id,
|
||||
@@ -6415,7 +6415,7 @@ describe('registerPtyHandlers', () => {
|
||||
mainWindow.webContents.send.mockClear()
|
||||
resizePty(null, { id: spawnResult.id, cols: 80, rows: 24 })
|
||||
mockProc.emitData('visible repaint')
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
|
||||
expect(mainWindow.webContents.send).toHaveBeenCalledWith('pty:data', {
|
||||
id: spawnResult.id,
|
||||
@@ -6448,7 +6448,7 @@ describe('registerPtyHandlers', () => {
|
||||
setRendererPtyVisible(null, { id: spawnResult.id, visible: true })
|
||||
writePty(mainWindowIpcEvent, { id: spawnResult.id, data: 'x' })
|
||||
mockProc.emitData('x')
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
|
||||
expect(mainWindow.webContents.send).toHaveBeenCalledWith('pty:data', {
|
||||
id: spawnResult.id,
|
||||
@@ -6483,7 +6483,7 @@ describe('registerPtyHandlers', () => {
|
||||
|
||||
expect(mockProc.proc.write).toHaveBeenCalledWith('\x1b]10;rgb:eeee/eeee/eeee\x1b\\')
|
||||
expect(mockProc.proc.write).toHaveBeenCalledWith('\x1b]11;rgb:1111/1111/1111\x1b\\')
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
expect(mainWindow.webContents.send).toHaveBeenCalledWith('pty:data', {
|
||||
id: spawnResult.id,
|
||||
data: 'ready'
|
||||
@@ -6517,7 +6517,7 @@ describe('registerPtyHandlers', () => {
|
||||
|
||||
expect(mockProc.proc.write).toHaveBeenCalledWith('\x1b]10;rgb:eeee/eeee/eeee\x1b\\')
|
||||
expect(mockProc.proc.write).toHaveBeenCalledWith('\x1b]11;rgb:1111/1111/1111\x1b\\')
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
expect(mainWindow.webContents.send).toHaveBeenCalledWith('pty:data', {
|
||||
id: spawnResult.id,
|
||||
data: 'ready'
|
||||
@@ -6549,7 +6549,7 @@ describe('registerPtyHandlers', () => {
|
||||
mockProc.emitData(`${query}ready`)
|
||||
|
||||
expect(mockProc.proc.write).not.toHaveBeenCalled()
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
expect(mainWindow.webContents.send).toHaveBeenCalledWith('pty:data', {
|
||||
id: spawnResult.id,
|
||||
data: `${query}ready`
|
||||
@@ -6583,7 +6583,7 @@ describe('registerPtyHandlers', () => {
|
||||
mockProc.emitData(`${command}ready`)
|
||||
|
||||
expect(mockProc.proc.write).not.toHaveBeenCalled()
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
expect(mainWindow.webContents.send).toHaveBeenCalledWith('pty:data', {
|
||||
id: spawnResult.id,
|
||||
data: `${command}ready`
|
||||
@@ -6644,7 +6644,7 @@ describe('registerPtyHandlers', () => {
|
||||
|
||||
expect(write).toHaveBeenCalledWith(spawnResult.id, '\x1b]10;rgb:eeee/eeee/eeee\x1b\\')
|
||||
expect(write).toHaveBeenCalledWith(spawnResult.id, '\x1b]11;rgb:1111/1111/1111\x1b\\')
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
expect(mainWindow.webContents.send).toHaveBeenCalledWith('pty:data', {
|
||||
id: spawnResult.id,
|
||||
data: 'daemon-ready'
|
||||
@@ -6719,7 +6719,7 @@ describe('registerPtyHandlers', () => {
|
||||
id: spawnResult.id,
|
||||
data: '\x1b]10;?\x1b\\\x1b]11;?\x1b\\ready'
|
||||
})
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
|
||||
expect(write).toHaveBeenCalledWith(spawnResult.id, '\x1b]10;rgb:eeee/eeee/eeee\x1b\\')
|
||||
expect(write).toHaveBeenCalledWith(spawnResult.id, '\x1b]11;rgb:1111/1111/1111\x1b\\')
|
||||
@@ -6759,7 +6759,7 @@ describe('registerPtyHandlers', () => {
|
||||
id: spawnResult.id,
|
||||
data: '\x1b[20;2Hredraw'
|
||||
})
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
expect(mainWindow.webContents.send).toHaveBeenCalledTimes(1)
|
||||
} finally {
|
||||
vi.useRealTimers()
|
||||
@@ -6815,7 +6815,7 @@ describe('registerPtyHandlers', () => {
|
||||
mockProc.emitData(largeOutput)
|
||||
|
||||
expect(mainWindow.webContents.send).not.toHaveBeenCalled()
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
expect(mainWindow.webContents.send).toHaveBeenCalledWith('pty:data', {
|
||||
id: spawnResult.id,
|
||||
data: largeOutput
|
||||
@@ -6851,7 +6851,7 @@ describe('registerPtyHandlers', () => {
|
||||
}
|
||||
|
||||
expect(mainWindow.webContents.send).toHaveBeenCalledTimes(64)
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
expect(mainWindow.webContents.send).toHaveBeenCalledTimes(65)
|
||||
expect(mainWindow.webContents.send).toHaveBeenNthCalledWith(65, 'pty:data', {
|
||||
id: spawnResult.id,
|
||||
@@ -6889,7 +6889,7 @@ describe('registerPtyHandlers', () => {
|
||||
id: spawnResult.id,
|
||||
data: redraw
|
||||
})
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
expect(mainWindow.webContents.send).toHaveBeenCalledTimes(1)
|
||||
} finally {
|
||||
vi.useRealTimers()
|
||||
@@ -6921,7 +6921,7 @@ describe('registerPtyHandlers', () => {
|
||||
mockProc.emitData('redraw')
|
||||
|
||||
expect(mainWindow.webContents.send).not.toHaveBeenCalled()
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
expect(mainWindow.webContents.send).toHaveBeenCalledWith('pty:data', {
|
||||
id: spawnResult.id,
|
||||
data: `${pendingOutput}redraw`
|
||||
@@ -6956,7 +6956,7 @@ describe('registerPtyHandlers', () => {
|
||||
secondProc.emitData('second-terminal-output')
|
||||
firstProc.emitData(`${firstChunk}${firstRemainder}`)
|
||||
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
|
||||
expect(mainWindow.webContents.send).toHaveBeenCalledTimes(2)
|
||||
expect(mainWindow.webContents.send).toHaveBeenNthCalledWith(1, 'pty:data', {
|
||||
@@ -7002,7 +7002,7 @@ describe('registerPtyHandlers', () => {
|
||||
mainWindow.webContents.send.mockClear()
|
||||
|
||||
firstProc.emitData('x'.repeat(600 * 1024))
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
for (let index = 0; index < 31; index++) {
|
||||
vi.advanceTimersByTime(1)
|
||||
}
|
||||
@@ -7027,7 +7027,7 @@ describe('registerPtyHandlers', () => {
|
||||
})
|
||||
|
||||
secondProc.emitData('second-terminal-output')
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
|
||||
expect(mainWindow.webContents.send).toHaveBeenCalledTimes(33)
|
||||
expect(mainWindow.webContents.send).toHaveBeenNthCalledWith(33, 'pty:data', {
|
||||
@@ -7085,7 +7085,7 @@ describe('registerPtyHandlers', () => {
|
||||
// Saturate the renderer in-flight window (512 KB) with no ACKs — the
|
||||
// frozen/starved-renderer shape from the field reports.
|
||||
mockProc.emitData('x'.repeat(600 * 1024))
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
for (let index = 0; index < 32; index++) {
|
||||
vi.advanceTimersByTime(1)
|
||||
}
|
||||
@@ -7109,7 +7109,7 @@ describe('registerPtyHandlers', () => {
|
||||
// sentinel so the pane repaints from the main-owned snapshot.
|
||||
mainWindow.webContents.send.mockClear()
|
||||
ackData(null, { id: spawn.id, charCount: 512 * 1024 })
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
expect(mainWindow.webContents.send).toHaveBeenCalledWith('pty:data', {
|
||||
id: spawn.id,
|
||||
data: '',
|
||||
@@ -7119,7 +7119,7 @@ describe('registerPtyHandlers', () => {
|
||||
// Fresh output after the sentinel flows normally again.
|
||||
mainWindow.webContents.send.mockClear()
|
||||
mockProc.emitData('back to normal')
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
expect(mainWindow.webContents.send).toHaveBeenCalledWith('pty:data', {
|
||||
id: spawn.id,
|
||||
data: 'back to normal'
|
||||
@@ -7147,7 +7147,7 @@ describe('registerPtyHandlers', () => {
|
||||
// Saturate the in-flight window with no ACKs, then buffer 3 MB — over
|
||||
// the floor, under the scaled cap: it must be retained, not dropped.
|
||||
mockProc.emitData('x'.repeat(600 * 1024))
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
for (let index = 0; index < 32; index++) {
|
||||
vi.advanceTimersByTime(1)
|
||||
}
|
||||
@@ -7264,7 +7264,7 @@ describe('registerPtyHandlers', () => {
|
||||
mainWindow.webContents.send.mockClear()
|
||||
|
||||
mockProc.emitData('remote-output')
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
|
||||
expect(mainWindow.webContents.send).toHaveBeenCalledWith('pty:data', {
|
||||
id: 'remote-like-pty',
|
||||
@@ -7315,7 +7315,7 @@ describe('registerPtyHandlers', () => {
|
||||
for (const proc of bulkProcs) {
|
||||
proc.emitData('x'.repeat(600 * 1024))
|
||||
}
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
for (let index = 0; index < 400; index++) {
|
||||
vi.advanceTimersByTime(1)
|
||||
}
|
||||
@@ -7381,7 +7381,7 @@ describe('registerPtyHandlers', () => {
|
||||
for (const proc of procs) {
|
||||
proc.emitData('x'.repeat(600 * 1024))
|
||||
}
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
for (let index = 0; index < 400; index++) {
|
||||
vi.advanceTimersByTime(1)
|
||||
}
|
||||
@@ -7422,7 +7422,7 @@ describe('registerPtyHandlers', () => {
|
||||
for (let index = 0; index < procs.length - 1; index++) {
|
||||
procs[index]!.emitData('x'.repeat(600 * 1024))
|
||||
}
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
for (let index = 0; index < 400; index++) {
|
||||
vi.advanceTimersByTime(1)
|
||||
}
|
||||
@@ -7431,7 +7431,7 @@ describe('registerPtyHandlers', () => {
|
||||
const activeIndex = procs.length - 1
|
||||
procs[activeIndex]!.emitData('active-output')
|
||||
setActiveRendererPty(null, { id: spawns[activeIndex]!.id, active: true })
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
|
||||
expect(mainWindow.webContents.send).toHaveBeenCalledTimes(513)
|
||||
expect(mainWindow.webContents.send).toHaveBeenNthCalledWith(513, 'pty:data', {
|
||||
@@ -7465,7 +7465,7 @@ describe('registerPtyHandlers', () => {
|
||||
mainWindow.webContents.send.mockClear()
|
||||
|
||||
activeProc.emitData('x'.repeat(768 * 1024))
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
for (let index = 0; index < 31; index++) {
|
||||
vi.advanceTimersByTime(1)
|
||||
}
|
||||
@@ -7577,7 +7577,7 @@ describe('registerPtyHandlers', () => {
|
||||
|
||||
// A keystroke-sized redraw would take the immediate path when visible.
|
||||
mockProc.emitData('\x1b[20;2Hredraw')
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
|
||||
expect(mainWindow.webContents.send).toHaveBeenCalledTimes(1)
|
||||
expect(mainWindow.webContents.send).toHaveBeenCalledWith('pty:modelRestoreNeeded', {
|
||||
@@ -7608,7 +7608,7 @@ describe('registerPtyHandlers', () => {
|
||||
setHidden(null, { id: spawnResult.id, hidden: true })
|
||||
setInterest(null, { id: spawnResult.id, interested: true })
|
||||
mockProc.emitData('sidecar bytes')
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
expect(mainWindow.webContents.send).toHaveBeenCalledWith('pty:data', {
|
||||
id: spawnResult.id,
|
||||
data: 'sidecar bytes'
|
||||
@@ -7617,7 +7617,7 @@ describe('registerPtyHandlers', () => {
|
||||
setInterest(null, { id: spawnResult.id, interested: false })
|
||||
mainWindow.webContents.send.mockClear()
|
||||
mockProc.emitData('gated bytes')
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
expect(mainWindow.webContents.send).toHaveBeenCalledTimes(1)
|
||||
expect(mainWindow.webContents.send).toHaveBeenCalledWith('pty:modelRestoreNeeded', {
|
||||
id: spawnResult.id,
|
||||
@@ -7648,7 +7648,7 @@ describe('registerPtyHandlers', () => {
|
||||
|
||||
setHidden(null, { id: spawnResult.id, hidden: true })
|
||||
mockProc.emitData('still delivered')
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
|
||||
expect(mainWindow.webContents.send).toHaveBeenCalledTimes(1)
|
||||
expect(mainWindow.webContents.send).toHaveBeenCalledWith('pty:data', {
|
||||
@@ -7685,7 +7685,7 @@ describe('registerPtyHandlers', () => {
|
||||
id: spawnResult.id,
|
||||
reason: 'hidden-drop'
|
||||
})
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
expect(mainWindow.webContents.send).toHaveBeenCalledTimes(1)
|
||||
expect(getPtyRendererDeliveryDebugSnapshot()).toMatchObject({ pendingPtyCount: 0 })
|
||||
} finally {
|
||||
@@ -7710,7 +7710,7 @@ describe('registerPtyHandlers', () => {
|
||||
|
||||
setHidden(null, { id: spawnResult.id, hidden: true })
|
||||
mockProc.emitData('dropped while hidden')
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
expect(mainWindow.webContents.send).toHaveBeenCalledTimes(1)
|
||||
|
||||
// Why: a renderer reload can replace the view that latched
|
||||
@@ -7723,7 +7723,7 @@ describe('registerPtyHandlers', () => {
|
||||
})
|
||||
|
||||
mockProc.emitData('visible again')
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
expect(mainWindow.webContents.send).toHaveBeenLastCalledWith('pty:data', {
|
||||
id: spawnResult.id,
|
||||
data: 'visible again'
|
||||
@@ -7803,7 +7803,7 @@ describe('registerPtyHandlers', () => {
|
||||
|
||||
setHidden(null, { id: spawnResult.id, hidden: true })
|
||||
mockProc.emitData('dropped while hidden')
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
expect(mainWindow.webContents.send).toHaveBeenCalledTimes(1)
|
||||
|
||||
// Why: a hidden remount (tab move, parking handoff) re-marks the PTY
|
||||
@@ -8036,7 +8036,7 @@ describe('registerPtyHandlers', () => {
|
||||
|
||||
expect(isHiddenRendererPty(spawnResult.id)).toBe(true)
|
||||
mockProc.emitData('first chunk')
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
|
||||
expect(mainWindow.webContents.send).toHaveBeenCalledTimes(1)
|
||||
expect(mainWindow.webContents.send).toHaveBeenCalledWith('pty:modelRestoreNeeded', {
|
||||
@@ -8063,7 +8063,7 @@ describe('registerPtyHandlers', () => {
|
||||
|
||||
expect(isHiddenRendererPty(spawnResult.id)).toBe(false)
|
||||
mockProc.emitData('visible output')
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
|
||||
expect(mainWindow.webContents.send).toHaveBeenCalledWith('pty:data', {
|
||||
id: spawnResult.id,
|
||||
@@ -8147,7 +8147,7 @@ describe('registerPtyHandlers', () => {
|
||||
mockProc.emitData('z'.repeat(64 * 1024))
|
||||
expect(mainWindow.webContents.send).toHaveBeenCalledTimes(1)
|
||||
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
expect(mainWindow.webContents.send).toHaveBeenCalledTimes(2)
|
||||
expect(mainWindow.webContents.send).toHaveBeenLastCalledWith('pty:data', {
|
||||
id: spawnResult.id,
|
||||
@@ -8189,7 +8189,7 @@ describe('registerPtyHandlers', () => {
|
||||
expect.anything()
|
||||
)
|
||||
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
expect(mainWindow.webContents.send).toHaveBeenLastCalledWith('pty:data', {
|
||||
id: spawnResult.id,
|
||||
data: '',
|
||||
@@ -8225,7 +8225,7 @@ describe('registerPtyHandlers', () => {
|
||||
mockProc.emitData('stale redraw')
|
||||
|
||||
expect(mainWindow.webContents.send).not.toHaveBeenCalled()
|
||||
vi.advanceTimersByTime(8)
|
||||
vi.advanceTimersByTime(2)
|
||||
expect(mainWindow.webContents.send).toHaveBeenCalledWith('pty:data', {
|
||||
id: spawnResult.id,
|
||||
data: 'stale redraw'
|
||||
|
||||
+116
@@ -0,0 +1,116 @@
|
||||
{
|
||||
"benchmark": "terminal-pipeline",
|
||||
"label": "dev-batch2ms",
|
||||
"timestamp": "2026-07-03T20:29:12.240Z",
|
||||
"terminal": {
|
||||
"program": "Orca",
|
||||
"version": "1.4.120",
|
||||
"term": "xterm-256color",
|
||||
"cols": 282,
|
||||
"rows": 80,
|
||||
"tty": true
|
||||
},
|
||||
"machine": {
|
||||
"platform": "darwin",
|
||||
"arch": "arm64",
|
||||
"cpu": "Apple M4",
|
||||
"release": "25.2.0",
|
||||
"node": "v26.0.0"
|
||||
},
|
||||
"config": {
|
||||
"sizeMb": 3,
|
||||
"iterations": 5,
|
||||
"dsrCount": 200
|
||||
},
|
||||
"dsrIdle": {
|
||||
"count": 200,
|
||||
"p50": 1.5039170000000013,
|
||||
"p90": 4.130499999999984,
|
||||
"p99": 14.714749999999981,
|
||||
"max": 82.719833,
|
||||
"timeouts": 0
|
||||
},
|
||||
"throughput": [
|
||||
{
|
||||
"fixture": "ascii-log",
|
||||
"fixtureBytes": 3145851,
|
||||
"wallMs": {
|
||||
"count": 5,
|
||||
"p50": 675.0551660000001,
|
||||
"p90": 1331.6419580000002,
|
||||
"p99": 1331.6419580000002,
|
||||
"max": 1331.6419580000002
|
||||
},
|
||||
"mbPerSec": {
|
||||
"count": 5,
|
||||
"p50": 4.444255007658022,
|
||||
"p90": 7.383804508967684,
|
||||
"p99": 7.383804508967684,
|
||||
"max": 7.383804508967684
|
||||
}
|
||||
},
|
||||
{
|
||||
"fixture": "cjk-emoji",
|
||||
"fixtureBytes": 3145785,
|
||||
"wallMs": {
|
||||
"count": 5,
|
||||
"p50": 308.82854099999986,
|
||||
"p90": 431.20550000000003,
|
||||
"p99": 431.20550000000003,
|
||||
"max": 431.20550000000003
|
||||
},
|
||||
"mbPerSec": {
|
||||
"count": 5,
|
||||
"p50": 9.714304091589891,
|
||||
"p90": 10.261337926284375,
|
||||
"p99": 10.261337926284375,
|
||||
"max": 10.261337926284375
|
||||
}
|
||||
},
|
||||
{
|
||||
"fixture": "agent-tui",
|
||||
"fixtureBytes": 3146560,
|
||||
"wallMs": {
|
||||
"count": 5,
|
||||
"p50": 306.4545420000013,
|
||||
"p90": 330.3279170000005,
|
||||
"p99": 330.3279170000005,
|
||||
"max": 330.3279170000005
|
||||
},
|
||||
"mbPerSec": {
|
||||
"count": 5,
|
||||
"p50": 9.791969267113153,
|
||||
"p90": 10.547125590007429,
|
||||
"p99": 10.547125590007429,
|
||||
"max": 10.547125590007429
|
||||
}
|
||||
},
|
||||
{
|
||||
"fixture": "styles-stress",
|
||||
"fixtureBytes": 3145734,
|
||||
"wallMs": {
|
||||
"count": 5,
|
||||
"p50": 645.0449580000004,
|
||||
"p90": 704.4664589999993,
|
||||
"p99": 704.4664589999993,
|
||||
"max": 704.4664589999993
|
||||
},
|
||||
"mbPerSec": {
|
||||
"count": 5,
|
||||
"p50": 4.650847487200879,
|
||||
"p90": 4.823647924291215,
|
||||
"p99": 4.823647924291215,
|
||||
"max": 4.823647924291215
|
||||
}
|
||||
}
|
||||
],
|
||||
"dsrUnderLoad": {
|
||||
"paceBytesPerSec": 1048576,
|
||||
"count": 50,
|
||||
"p50": 8.004875000000538,
|
||||
"p90": 10.1282910000009,
|
||||
"p99": 12.25512499999968,
|
||||
"max": 12.25512499999968,
|
||||
"timeouts": 0
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user