]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
workflow(benchmark): warmup run (#287)
authorRizumu Ayaka <rizumu@ayaka.moe>
Mon, 11 Nov 2024 09:01:53 +0000 (17:01 +0800)
committerGitHub <noreply@github.com>
Mon, 11 Nov 2024 09:01:53 +0000 (17:01 +0800)
benchmark/client/index.html
benchmark/index.js

index 22524c4b89360ae9d01f9eb0aef2db032ed665ed..c3ca4c535908866f950a5e2dd7b76d84bcc7bb42 100644 (file)
@@ -10,7 +10,7 @@
       }
     </style>
   </head>
-  <body>
+  <body class="done">
     <div id="app"></div>
     <script type="module" src="./index.ts"></script>
   </body>
index 884459c915fbc84ae4b9ee39d0ebd48f5beb54c4..eddf3b903666ee9e41d38da67f088b4eee3ef5bb 100644 (file)
@@ -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 {
@@ -20,6 +22,7 @@ const {
     noVapor,
     port: portStr,
     count: countStr,
+    warmupCount: warmupCountStr,
     noHeadless,
     devBuild,
   },
@@ -56,6 +59,11 @@ const {
       short: 'c',
       default: '30',
     },
+    warmupCount: {
+      type: 'string',
+      short: 'w',
+      default: '5',
+    },
     noHeadless: {
       type: 'boolean',
     },
@@ -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) {
@@ -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:',
@@ -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)
   }
@@ -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 */
@@ -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