From f06f11072ca278c376cab2e24ab30dff79e63afd Mon Sep 17 00:00:00 2001 From: Glandos Date: Tue, 8 Jun 2021 16:12:27 +0200 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.js | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/core/util/props.js b/src/core/util/props.js index 5a90f21b5f0..dab950ebfb0 100644 --- a/src/core/util/props.js +++ b/src/core/util/props.js @@ -187,11 +187,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) }