From a6b4590bd09582de2cec5adc776efb7fe3a79d99 Mon Sep 17 00:00:00 2001 From: Glandos Date: Mon, 18 Nov 2024 09:48:31 +0100 Subject: [PATCH] perf(core): getType uses a cache for well known types. getType is called a lot, and it just run the same regexp over and over on the same base types. A cache increase its own efficiency by more than 80% for basic types. On a real world application with a lot of components, getType was profiled for 8% of call duration before this patch, and about 0.5% after. The impact is more limited for smaller applications. --- src/core/util/props.ts | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/core/util/props.ts b/src/core/util/props.ts index 795f5ac37a6..613f0563e71 100644 --- a/src/core/util/props.ts +++ b/src/core/util/props.ts @@ -190,11 +190,28 @@ const functionTypeCheckRE = /^\s*function (\w+)/ * because a simple equality check will fail when running * across different vms / iframes. */ -function getType(fn) { +function getTypeName (fn) { const match = fn && fn.toString().match(functionTypeCheckRE) return match ? match[1] : '' } +/** + * Build a cache for known types. + * We could build it dynamically, but since array are sometime requested, + * it fill up the cache for nothing. + * Type list is taken from https://vuejs.org/v2/guide/components-props.html#Type-Checks + */ +const TYPE_CACHE = new Map( + [String, Number, Boolean, Array, Object, Date, Function, Symbol, null, undefined].map(fn => [fn, getTypeName(fn)])) + +function getType (fn) { + const cached = TYPE_CACHE.get(fn) + if (cached !== undefined) { + return cached + } + return getTypeName(fn) +} + function isSameType(a, b) { return getType(a) === getType(b) }