Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions benchmarks/memory/client/lifecycle.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,3 +44,10 @@ export async function drainMicrotasks() {
await Promise.resolve()
await Promise.resolve()
}

// Render signals fire before framework/jsdom cleanup has fully settled; wait a
// microtask turn and one frame so churn iterations measure steady state.
export async function settleAfterRender() {
await drainMicrotasks()
await nextAnimationFrame()
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
nextAnimationFrame,
noop,
removeBenchContainer,
settleAfterRender,
warnClientMemoryDevMode,
} from '#memory-client/lifecycle'
import type { Framework, MountTestApp } from '#memory-client/lifecycle'
Expand Down Expand Up @@ -164,13 +165,15 @@ export function createWorkload(
for (let attempt = 0; attempt < 10; attempt++) {
try {
assertRenderedPage(page, id)
await settleAfterRender()
return
} catch {
await nextAnimationFrame()
}
}

assertRenderedPage(page, id)
await settleAfterRender()
}

async function waitForSlowLoader(id: string) {
Expand Down Expand Up @@ -229,6 +232,7 @@ export function createWorkload(
}),
rendered,
])
await settleAfterRender()
}

startSlowNavigation = (id) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import {
nextAnimationFrame,
noop,
removeBenchContainer,
settleAfterRender,
warnClientMemoryDevMode,
} from '#memory-client/lifecycle'
import type { Framework, MountTestApp } from '#memory-client/lifecycle'
Expand Down Expand Up @@ -90,13 +91,15 @@ export function createWorkload(
for (let attempt = 0; attempt < 10; attempt++) {
try {
assertRenderedShell()
await settleAfterRender()
return
} catch {
await nextAnimationFrame()
}
}

assertRenderedShell()
await settleAfterRender()
}

function waitForNextRender(pathname: string) {
Expand Down Expand Up @@ -142,6 +145,7 @@ export function createWorkload(
replace: true,
})
await rendered
await settleAfterRender()
assertRenderedPage(id)
}

Expand Down
2 changes: 2 additions & 0 deletions benchmarks/memory/client/scenarios/mount-unmount/shared.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import {
drainMicrotasks,
noop,
removeBenchContainer,
settleAfterRender,
warnClientMemoryDevMode,
} from '#memory-client/lifecycle'
import type { Framework, MountTestApp } from '#memory-client/lifecycle'
Expand Down Expand Up @@ -47,6 +48,7 @@ export function createWorkload(

await router.load()
await rendered
await settleAfterRender()
unsubscribe()
unsubscribe = noop
} finally {
Expand Down
4 changes: 4 additions & 0 deletions benchmarks/memory/client/scenarios/navigation-churn/shared.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import {
nextAnimationFrame,
noop,
removeBenchContainer,
settleAfterRender,
warnClientMemoryDevMode,
} from '#memory-client/lifecycle'
import type { Framework, MountTestApp } from '#memory-client/lifecycle'
Expand Down Expand Up @@ -47,13 +48,15 @@ export function createWorkload(
for (let attempt = 0; attempt < 10; attempt++) {
try {
assertRenderedPage(target)
await settleAfterRender()
return
} catch {
await nextAnimationFrame()
}
}

assertRenderedPage(target)
await settleAfterRender()
}

function waitForNextRender() {
Expand Down Expand Up @@ -86,6 +89,7 @@ export function createWorkload(
}),
rendered,
])
await settleAfterRender()
}

await router.load()
Expand Down
5 changes: 5 additions & 0 deletions benchmarks/memory/client/scenarios/preload-churn/shared.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
nextAnimationFrame,
noop,
removeBenchContainer,
settleAfterRender,
warnClientMemoryDevMode,
} from '#memory-client/lifecycle'
import type { Framework, MountTestApp } from '#memory-client/lifecycle'
Expand Down Expand Up @@ -86,13 +87,15 @@ export function createWorkload(
for (let attempt = 0; attempt < 10; attempt++) {
try {
assertRenderedIndex()
await settleAfterRender()
return
} catch {
await nextAnimationFrame()
}
}

assertRenderedIndex()
await settleAfterRender()
}

function waitForNextRender() {
Expand Down Expand Up @@ -134,6 +137,7 @@ export function createWorkload(
}),
rendered,
])
await settleAfterRender()
}

navigateToIndex = async () => {
Expand All @@ -145,6 +149,7 @@ export function createWorkload(
}),
rendered,
])
await settleAfterRender()
}

await router.load()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import {
nextAnimationFrame,
noop,
removeBenchContainer,
settleAfterRender,
warnClientMemoryDevMode,
} from '#memory-client/lifecycle'
import type { Framework, MountTestApp } from '#memory-client/lifecycle'
Expand Down Expand Up @@ -63,13 +64,15 @@ export function createWorkload(
for (let attempt = 0; attempt < 10; attempt++) {
try {
assertRenderedId(expected)
await settleAfterRender()
return
} catch {
await nextAnimationFrame()
}
}

assertRenderedId(expected)
await settleAfterRender()
}

function waitForNextRender() {
Expand Down Expand Up @@ -104,6 +107,7 @@ export function createWorkload(
}),
rendered,
])
await settleAfterRender()
}

await router.load()
Expand Down
11 changes: 11 additions & 0 deletions benchmarks/memory/server/bench-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,16 @@ export async function drainResponse(response: Response) {
}
}

// CodSpeed reports peak live memory, so queued stream/SSR cleanup from one
// response can otherwise be sampled during the next churn iteration.
export async function settleAfterDrainResponse() {
await Promise.resolve()
await Promise.resolve()
await new Promise<void>((resolve) => {
setImmediate(resolve)
})
}

export async function runSequentialRequestLoop(
handler: StartRequestHandler,
options: RunSequentialRequestLoopOptions,
Expand All @@ -86,5 +96,6 @@ export async function runSequentialRequestLoop(
validate(response, request)

await drainResponse(response)
await settleAfterDrainResponse()
}
}
4 changes: 2 additions & 2 deletions benchmarks/memory/server/scenarios/aborted-requests/shared.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { settleAfterDrainResponse } from '#memory-server/bench-utils'
import type { StartRequestHandler } from '#memory-server/bench-utils'

export type { StartRequestHandler }
Expand Down Expand Up @@ -189,8 +190,7 @@ async function cancelReader(
}

async function drainCancellation(mode: AbortedRequestDrainMode) {
await Promise.resolve()
await Promise.resolve()
await settleAfterDrainResponse()

if (mode === 'tasks') {
await new Promise((resolve) => setTimeout(resolve, 0))
Expand Down
Loading