]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
perf: avoid now() overhead during dev measure calls
authorEvan You <evan@vuejs.org>
Wed, 29 Jan 2025 07:53:20 +0000 (15:53 +0800)
committerEvan You <evan@vuejs.org>
Wed, 29 Jan 2025 07:53:20 +0000 (15:53 +0800)
packages/runtime-core/src/profiling.ts
packages/runtime-vapor/src/renderEffect.ts

index ec789de721170de2acd09a73189652aa8f929f7d..c14207f91e4ef686851f28793691f88644d0e04e 100644 (file)
@@ -5,6 +5,15 @@ import { devtoolsPerfEnd, devtoolsPerfStart } from './devtools'
 let supported: boolean
 let perf: Performance
 
+// To avoid the overhead of repeatedly calling Date.now(), we cache
+// and use the same timestamp for all event listeners attached in the same tick.
+let cachedNow: number = 0
+const p = /*@__PURE__*/ Promise.resolve()
+const getNow = () =>
+  cachedNow ||
+  (p.then(() => (cachedNow = 0)),
+  (cachedNow = isSupported() ? perf.now() : Date.now()))
+
 /**
  * @internal
  */
@@ -17,7 +26,7 @@ export function startMeasure(
   }
 
   if (__DEV__ || __FEATURE_PROD_DEVTOOLS__) {
-    devtoolsPerfStart(instance, type, isSupported() ? perf.now() : Date.now())
+    devtoolsPerfStart(instance, type, getNow())
   }
 }
 
@@ -42,7 +51,7 @@ export function endMeasure(
   }
 
   if (__DEV__ || __FEATURE_PROD_DEVTOOLS__) {
-    devtoolsPerfEnd(instance, type, isSupported() ? perf.now() : Date.now())
+    devtoolsPerfEnd(instance, type, getNow())
   }
 }
 
index 8b45b38226539ac6c7bbf176f4d45dbfce39f29a..0e4556fe1e0b11dad9c823ccfddcaac111975a44 100644 (file)
@@ -67,5 +67,4 @@ export function renderEffect(fn: () => void, noLifecycle = false): void {
   effect.run()
 
   // TODO recurse handling
-  // TODO measure
 }