Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

workflow(benchmark): warmup run #287

Merged
merged 1 commit into from
Nov 11, 2024
Merged
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
2 changes: 1 addition & 1 deletion benchmark/client/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
}
</style>
</head>
<body>
<body class="done">
<div id="app"></div>
<script type="module" src="./index.ts"></script>
</body>
Expand Down
68 changes: 52 additions & 16 deletions benchmark/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import sirv from 'sirv'
import { launch } from 'puppeteer'
import colors from 'picocolors'
import { exec, getSha } from '../scripts/utils.js'
import process from 'node:process'
import readline from 'node:readline'

// Thanks to https://github.com/krausest/js-framework-benchmark (Apache-2.0 license)
const {
Expand All @@ -20,6 +22,7 @@ const {
noVapor,
port: portStr,
count: countStr,
warmupCount: warmupCountStr,
noHeadless,
devBuild,
},
Expand Down Expand Up @@ -56,6 +59,11 @@ const {
short: 'c',
default: '30',
},
warmupCount: {
type: 'string',
short: 'w',
default: '5',
},
noHeadless: {
type: 'boolean',
},
Expand All @@ -68,6 +76,7 @@ const {

const port = +(/** @type {string}*/ (portStr))
const count = +(/** @type {string}*/ (countStr))
const warmupCount = +(/** @type {string}*/ (warmupCountStr))
const sha = await getSha(true)

if (!skipLib) {
Expand Down Expand Up @@ -226,22 +235,11 @@ async function doBench(browser, isVapor) {
await forceGC()
const t = performance.now()

for (let i = 0; i < count; i++) {
await clickButton('run') // test: create rows
await clickButton('update') // partial update
await clickButton('swaprows') // swap rows
await select() // test: select row, remove row
await clickButton('clear') // clear rows
console.log('warmup run')
await eachRun(() => withoutRecord(benchOnce), warmupCount)

await withoutRecord(() => clickButton('run'))
await clickButton('add') // append rows to large table

await withoutRecord(() => clickButton('clear'))
await clickButton('runLots') // create many rows
await withoutRecord(() => clickButton('clear'))

// TODO replace all rows
}
console.log('benchmark run')
await eachRun(benchOnce, count)

console.info(
'Total time:',
Expand All @@ -261,6 +259,23 @@ async function doBench(browser, isVapor) {
await page.close()
return result

async function benchOnce() {
await clickButton('run') // test: create rows
await clickButton('update') // partial update
await clickButton('swaprows') // swap rows
await select() // test: select row, remove row
await clickButton('clear') // clear rows

await withoutRecord(() => clickButton('run'))
await clickButton('add') // append rows to large table

await withoutRecord(() => clickButton('clear'))
await clickButton('runLots') // create many rows
await withoutRecord(() => clickButton('clear'))

// TODO replace all rows
}

function getTimes() {
return page.evaluate(() => /** @type {any} */ (globalThis).times)
}
Expand All @@ -273,9 +288,13 @@ async function doBench(browser, isVapor) {

/** @param {() => any} fn */
async function withoutRecord(fn) {
const currentRecordTime = await page.evaluate(() => globalThis.recordTime)
await page.evaluate(() => (globalThis.recordTime = false))
await fn()
await page.evaluate(() => (globalThis.recordTime = true))
await page.evaluate(
currentRecordTime => (globalThis.recordTime = currentRecordTime),
currentRecordTime,
)
}

/** @param {string} id */
Expand All @@ -298,6 +317,23 @@ async function doBench(browser, isVapor) {
}
}

/**
* @param {Function} bench
* @param {number} count
*/
async function eachRun(bench, count) {
for (let i = 0; i < count; i++) {
readline.cursorTo(process.stdout, 0)
readline.clearLine(process.stdout, 0)
process.stdout.write(`${i + 1}/${count}`)
await bench()
}
if (count === 0) {
process.stdout.write('0/0 (skip)')
}
process.stdout.write('\n')
}

async function initBrowser() {
const disableFeatures = [
'Translate', // avoid translation popups
Expand Down