You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@echarts.apache.org by sh...@apache.org on 2021/07/13 14:54:11 UTC

[echarts] branch dataset-perf updated: refact(data): try to cache dim name map in complete dimensions

This is an automated email from the ASF dual-hosted git repository.

shenyi pushed a commit to branch dataset-perf
in repository https://gitbox.apache.org/repos/asf/echarts.git


The following commit(s) were added to refs/heads/dataset-perf by this push:
     new 7573ceb  refact(data): try to cache dim name map in complete dimensions
7573ceb is described below

commit 7573ceb7e4e1818fc5b9c59e4b85eef801bd9317
Author: pissang <bm...@gmail.com>
AuthorDate: Tue Jul 13 22:52:39 2021 +0800

    refact(data): try to cache dim name map in complete dimensions
---
 src/data/helper/createDimensions.ts | 51 ++++++++++++++++++++++++-------------
 1 file changed, 33 insertions(+), 18 deletions(-)

diff --git a/src/data/helper/createDimensions.ts b/src/data/helper/createDimensions.ts
index efd1dfb..3e69c40 100644
--- a/src/data/helper/createDimensions.ts
+++ b/src/data/helper/createDimensions.ts
@@ -29,13 +29,16 @@ import {
 } from '../../util/types';
 import SeriesData from '../SeriesData';
 import DataDimensionInfo from '../DataDimensionInfo';
-import { clone, createHashMap, defaults, each, extend, HashMap, isObject, isString, keys, map } from 'zrender/src/core/util';
+import { clone, createHashMap, defaults, each, HashMap, isObject, isString, map } from 'zrender/src/core/util';
 import OrdinalMeta from '../OrdinalMeta';
 import { createSourceFromSeriesDataOption, isSourceInstance, Source } from '../Source';
-import DataStorage, { CtorInt32Array, CtorUint32Array } from '../DataStorage';
-import { normalizeToArray } from '../../util/model';
+import DataStorage, { CtorInt32Array } from '../DataStorage';
+import { makeInner, normalizeToArray } from '../../util/model';
 import { BE_ORDINAL, guessOrdinal } from './sourceHelper';
 
+const inner = makeInner<{
+    dimNameMap: HashMap<DimensionIndex, DimensionName>
+}, Source>();
 
 export interface CoordDimensionDefinition extends DimensionDefinition {
     dimsDef?: (DimensionName | { name: DimensionName, defaultTooltip?: boolean })[];
@@ -98,12 +101,19 @@ export default function createDimensions(
 
     opt = opt || {};
 
-    const sysDims = (opt.coordDimensions || []).slice();
-    const dimsDef = (opt.dimensionsDefine || source.dimensionsDefine || []).slice();
-    const dataDimNameMap = createHashMap<DimensionIndex, DimensionName>();
+    const sysDims = opt.coordDimensions || [];
+    const dimsDef = opt.dimensionsDefine || source.dimensionsDefine || [];
     const coordDimNameMap = createHashMap<true, DimensionName>();
     const result: DataDimensionInfo[] = [];
     const omitUnusedDimensions = opt.omitUnusedDimensions;
+    // Try to cache the dimNameMap if the dimensionsDefine is from source.
+    const canCacheDimNameMap = (dimsDef === source.dimensionsDefine && omitUnusedDimensions);
+    let dataDimNameMap = canCacheDimNameMap && inner(source).dimNameMap;
+    let needsUpdateDataDimNameMap = false;
+    if (!dataDimNameMap) {
+        needsUpdateDataDimNameMap = true;
+        dataDimNameMap = createHashMap<DimensionIndex, DimensionName>();
+    }
 
     const dimCount = getDimCount(source, sysDims, dimsDef, opt.dimensionsCount);
 
@@ -137,19 +147,24 @@ export default function createDimensions(
         return result[idx];
     }
 
-    // Apply user defined dims (`name` and `type`) and init result.
-    for (let i = 0; i < dimCount; i++) {
-        const dimDefItemRaw = dimsDef[i];
-        const userDimName = isObject(dimDefItemRaw) ? dimDefItemRaw.name : dimDefItemRaw;
-        // Name will be applied later for avoiding duplication.
-        if (userDimName != null && dataDimNameMap.get(userDimName) == null) {
-            // Only if `series.dimensions` is defined in option
-            // displayName, will be set, and dimension will be diplayed vertically in
-            // tooltip by default.
-            dataDimNameMap.set(userDimName, i);
+    if (needsUpdateDataDimNameMap) {
+        for (let i = 0; i < dimCount; i++) {
+            const dimDefItemRaw = dimsDef[i];
+            const userDimName = isObject(dimDefItemRaw) ? dimDefItemRaw.name : dimDefItemRaw;
+            // Name will be applied later for avoiding duplication.
+            if (userDimName != null && dataDimNameMap.get(userDimName) == null) {
+                // Only if `series.dimensions` is defined in option
+                // displayName, will be set, and dimension will be diplayed vertically in
+                // tooltip by default.
+                dataDimNameMap.set(userDimName, i);
+            }
         }
-
-        if (!omitUnusedDimensions) {
+        if (canCacheDimNameMap) {
+            inner(source).dimNameMap = dataDimNameMap;
+        }
+    }
+    if (!omitUnusedDimensions) {
+        for (let i = 0; i < dimCount; i++) {
             getResultItem(i);
         }
     }

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@echarts.apache.org
For additional commands, e-mail: commits-help@echarts.apache.org