This is an automated email from the ASF dual-hosted git repository.
shenyi pushed a commit to branch line-optimize
in repository https://gitbox.apache.org/repos/asf/incubator-echarts.git
The following commit(s) were added to refs/heads/line-optimize by this push:
new f2fa790 fix(list): fix some null access issues after perf refactor
before.
f2fa790 is described below
commit f2fa7904e538799f83b588846a59d91356af075e
Author: pissang <[email protected]>
AuthorDate: Fri Sep 18 22:36:21 2020 +0800
fix(list): fix some null access issues after perf refactor before.
---
src/data/List.ts | 50 +++++++++++++++++++++++++++++++-------------------
1 file changed, 31 insertions(+), 19 deletions(-)
diff --git a/src/data/List.ts b/src/data/List.ts
index d32936a..ca2e84c 100644
--- a/src/data/List.ts
+++ b/src/data/List.ts
@@ -446,6 +446,7 @@ class List<
// Clear
this._storage = {};
+ this._storageArr = [];
this._indices = null;
this._nameList = nameList || [];
@@ -517,6 +518,7 @@ class List<
appendValues(values: any[][], names?: string[]): void {
const chunkSize = this._chunkSize;
const storage = this._storage;
+ const storageArr = this._storageArr;
const dimensions = this.dimensions;
const dimLen = dimensions.length;
const rawExtent = this._rawExtent;
@@ -531,12 +533,18 @@ class List<
rawExtent[dim] = getInitialExtent();
}
if (!storage[dim]) {
- storage[dim] = [];
+ const store: DataValueChunk[] = [];
+ storage[dim] = store;
+ storageArr.push(store);
}
prepareChunks(storage, this._dimensionInfos[dim], chunkSize,
originalChunkCount, end);
this._chunkCount = storage[dim].length;
}
+ const rawExtentArr = zrUtil.map(dimensions, (dim) => {
+ return rawExtent[dim];
+ });
+
const emptyDataItem = new Array(dimLen);
for (let idx = start; idx < end; idx++) {
const sourceIdx = idx - start;
@@ -544,14 +552,14 @@ class List<
const chunkOffset = idx % chunkSize;
// Store the data by dimensions
- for (let k = 0; k < dimLen; k++) {
- const dim = dimensions[k];
+ for (let dimIdx = 0; dimIdx < dimLen; dimIdx++) {
+ const dim = dimensions[dimIdx];
const val = this._dimValueGetterArrayRows(
- values[sourceIdx] || emptyDataItem, dim, sourceIdx, k
+ values[sourceIdx] || emptyDataItem, dim, sourceIdx, dimIdx
) as ParsedValueNumeric;
- storage[dim][chunkIndex][chunkOffset] = val;
+ storageArr[dimIdx][chunkIndex][chunkOffset] = val;
- const dimRawExtent = rawExtent[dim];
+ const dimRawExtent = rawExtentArr[dimIdx];
val < dimRawExtent[0] && (dimRawExtent[0] = val);
val > dimRawExtent[1] && (dimRawExtent[1] = val);
}
@@ -577,6 +585,7 @@ class List<
const chunkSize = this._chunkSize;
const rawData = this._rawData;
const storage = this._storage;
+ const storageArr = this._storageArr;
const dimensions = this.dimensions;
const dimLen = dimensions.length;
const dimensionInfoMap = this._dimensionInfos;
@@ -587,6 +596,7 @@ class List<
let nameDimIdx;
const originalChunkCount = this._chunkCount;
+
for (let i = 0; i < dimLen; i++) {
const dim = dimensions[i];
if (!rawExtent[dim]) {
@@ -602,7 +612,9 @@ class List<
}
if (!storage[dim]) {
- storage[dim] = [];
+ const store: DataValueChunk[] = [];
+ storage[dim] = store;
+ storageArr.push(store);
}
prepareChunks(storage, dimInfo, chunkSize, originalChunkCount,
end);
@@ -610,13 +622,9 @@ class List<
this._chunkCount = storage[dim].length;
}
- const storageArr: DataValueChunk[][] = this._storageArr = [];
- const rawExtentArr = [];
- for (let k = 0; k < dimLen; k++) {
- const dim = dimensions[k];
- storageArr.push(storage[dim]);
- rawExtentArr.push(rawExtent[dim]);
- }
+ const rawExtentArr = zrUtil.map(dimensions, (dim) => {
+ return rawExtent[dim];
+ });
let dataItem = [] as OptionDataItem;
for (let idx = start; idx < end; idx++) {
@@ -632,14 +640,14 @@ class List<
const chunkOffset = idx % chunkSize;
// Store the data by dimensions
- for (let k = 0; k < dimLen; k++) {
- const dim = dimensions[k];
- const dimStorage = storageArr[k][chunkIndex];
+ for (let dimIdx = 0; dimIdx < dimLen; dimIdx++) {
+ const dim = dimensions[dimIdx];
+ const dimStorage = storageArr[dimIdx][chunkIndex];
// PENDING NULL is empty or zero
- const val = this._dimValueGetter(dataItem, dim, idx, k) as
ParsedValueNumeric;
+ const val = this._dimValueGetter(dataItem, dim, idx, dimIdx)
as ParsedValueNumeric;
dimStorage[chunkOffset] = val;
- const dimRawExtent = rawExtentArr[k];
+ const dimRawExtent = rawExtentArr[dimIdx];
val < dimRawExtent[0] && (dimRawExtent[0] = val);
val > dimRawExtent[1] && (dimRawExtent[1] = val);
}
@@ -741,6 +749,10 @@ class List<
// Because in v8 access array by number variable is faster than access
object by string variable
// Not sure why but the optimization just works.
getByDimIdx(dimIdx: number, idx: number): ParsedValue {
+ if (!(idx >= 0 && idx < this._count)) {
+ return NaN;
+ }
+
const dimStore = this._storageArr[dimIdx];
const chunkSize = this._chunkSize;
if (!dimStore) {
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]