From 7cbaa2ac0141ad7c98f6a1a960a4e208d25c166f Mon Sep 17 00:00:00 2001 From: Jason Miller Date: Sun, 5 Aug 2018 15:52:03 -0400 Subject: [PATCH 1/2] Save 30b by removing sharding from the component recycler. It was actually slightly hurting performance in everything but PhantomJS. --- src/vdom/component-recycler.js | 34 ++++++++++------------------------ src/vdom/component.js | 4 ++-- 2 files changed, 12 insertions(+), 26 deletions(-) diff --git a/src/vdom/component-recycler.js b/src/vdom/component-recycler.js index dd828d31f8..499ad82294 100644 --- a/src/vdom/component-recycler.js +++ b/src/vdom/component-recycler.js @@ -1,23 +1,11 @@ import { Component } from '../component'; /** - * Retains a pool of Components for re-use, keyed on component name. - * Note: since component names are not unique or even necessarily available, - * these are primarily a form of sharding. - * @type {Object.} + * Retains a pool of Components for re-use. + * @type {Component[]} * @private */ -const components = {}; - - -/** - * Reclaim a component for later re-use by the recycler. - * @param {Component} component The component to collect - */ -export function collectComponent(component) { - let name = component.constructor.name; - (components[name] || (components[name] = [])).push(component); -} +export const recyclerComponents = []; /** @@ -29,8 +17,7 @@ export function collectComponent(component) { * @returns {import('../component').Component} */ export function createComponent(Ctor, props, context) { - let list = components[Ctor.name], - inst; + let inst, i = recyclerComponents.length; if (Ctor.prototype && Ctor.prototype.render) { inst = new Ctor(props, context); @@ -43,15 +30,14 @@ export function createComponent(Ctor, props, context) { } - if (list) { - for (let i=list.length; i--; ) { - if (list[i].constructor===Ctor) { - inst.nextBase = list[i].nextBase; - list.splice(i, 1); - break; - } + while (i--) { + if (recyclerComponents[i].constructor===Ctor) { + inst.nextBase = recyclerComponents[i].nextBase; + recyclerComponents.splice(i, 1); + return inst; } } + return inst; } diff --git a/src/vdom/component.js b/src/vdom/component.js index f788e4e71e..f347cac8ee 100644 --- a/src/vdom/component.js +++ b/src/vdom/component.js @@ -4,7 +4,7 @@ import { extend } from '../util'; import { enqueueRender } from '../render-queue'; import { getNodeProps } from './index'; import { diff, mounts, diffLevel, flushMounts, recollectNodeTree, removeChildren } from './diff'; -import { createComponent, collectComponent } from './component-recycler'; +import { createComponent, recyclerComponents } from './component-recycler'; import { removeNode } from '../dom/index'; /** @@ -287,7 +287,7 @@ export function unmountComponent(component) { component.nextBase = base; removeNode(base); - collectComponent(component); + recyclerComponents.push(component); removeChildren(base); } From 8dea9cc2da4c87f7b2416a57e210fd679e22b5fa Mon Sep 17 00:00:00 2001 From: Jason Miller Date: Sun, 5 Aug 2018 16:35:59 -0400 Subject: [PATCH 2/2] 8.3.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4a8ca1220c..f6a33caef0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "preact", - "version": "8.2.9", + "version": "8.3.0", "description": "Fast 3kb React alternative with the same modern API. Components & Virtual DOM.", "main": "dist/preact.js", "jsnext:main": "dist/preact.mjs",