提交 f2fa7904 编写于 作者: P pissang

fix(list): fix some null access issues after perf refactor before.

上级 e106d642
...@@ -446,6 +446,7 @@ class List< ...@@ -446,6 +446,7 @@ class List<
// Clear // Clear
this._storage = {}; this._storage = {};
this._storageArr = [];
this._indices = null; this._indices = null;
this._nameList = nameList || []; this._nameList = nameList || [];
...@@ -517,6 +518,7 @@ class List< ...@@ -517,6 +518,7 @@ class List<
appendValues(values: any[][], names?: string[]): void { appendValues(values: any[][], names?: string[]): void {
const chunkSize = this._chunkSize; const chunkSize = this._chunkSize;
const storage = this._storage; const storage = this._storage;
const storageArr = this._storageArr;
const dimensions = this.dimensions; const dimensions = this.dimensions;
const dimLen = dimensions.length; const dimLen = dimensions.length;
const rawExtent = this._rawExtent; const rawExtent = this._rawExtent;
...@@ -531,12 +533,18 @@ class List< ...@@ -531,12 +533,18 @@ class List<
rawExtent[dim] = getInitialExtent(); rawExtent[dim] = getInitialExtent();
} }
if (!storage[dim]) { if (!storage[dim]) {
storage[dim] = []; const store: DataValueChunk[] = [];
storage[dim] = store;
storageArr.push(store);
} }
prepareChunks(storage, this._dimensionInfos[dim], chunkSize, originalChunkCount, end); prepareChunks(storage, this._dimensionInfos[dim], chunkSize, originalChunkCount, end);
this._chunkCount = storage[dim].length; this._chunkCount = storage[dim].length;
} }
const rawExtentArr = zrUtil.map(dimensions, (dim) => {
return rawExtent[dim];
});
const emptyDataItem = new Array(dimLen); const emptyDataItem = new Array(dimLen);
for (let idx = start; idx < end; idx++) { for (let idx = start; idx < end; idx++) {
const sourceIdx = idx - start; const sourceIdx = idx - start;
...@@ -544,14 +552,14 @@ class List< ...@@ -544,14 +552,14 @@ class List<
const chunkOffset = idx % chunkSize; const chunkOffset = idx % chunkSize;
// Store the data by dimensions // Store the data by dimensions
for (let k = 0; k < dimLen; k++) { for (let dimIdx = 0; dimIdx < dimLen; dimIdx++) {
const dim = dimensions[k]; const dim = dimensions[dimIdx];
const val = this._dimValueGetterArrayRows( const val = this._dimValueGetterArrayRows(
values[sourceIdx] || emptyDataItem, dim, sourceIdx, k values[sourceIdx] || emptyDataItem, dim, sourceIdx, dimIdx
) as ParsedValueNumeric; ) 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[0] && (dimRawExtent[0] = val);
val > dimRawExtent[1] && (dimRawExtent[1] = val); val > dimRawExtent[1] && (dimRawExtent[1] = val);
} }
...@@ -577,6 +585,7 @@ class List< ...@@ -577,6 +585,7 @@ class List<
const chunkSize = this._chunkSize; const chunkSize = this._chunkSize;
const rawData = this._rawData; const rawData = this._rawData;
const storage = this._storage; const storage = this._storage;
const storageArr = this._storageArr;
const dimensions = this.dimensions; const dimensions = this.dimensions;
const dimLen = dimensions.length; const dimLen = dimensions.length;
const dimensionInfoMap = this._dimensionInfos; const dimensionInfoMap = this._dimensionInfos;
...@@ -587,6 +596,7 @@ class List< ...@@ -587,6 +596,7 @@ class List<
let nameDimIdx; let nameDimIdx;
const originalChunkCount = this._chunkCount; const originalChunkCount = this._chunkCount;
for (let i = 0; i < dimLen; i++) { for (let i = 0; i < dimLen; i++) {
const dim = dimensions[i]; const dim = dimensions[i];
if (!rawExtent[dim]) { if (!rawExtent[dim]) {
...@@ -602,7 +612,9 @@ class List< ...@@ -602,7 +612,9 @@ class List<
} }
if (!storage[dim]) { if (!storage[dim]) {
storage[dim] = []; const store: DataValueChunk[] = [];
storage[dim] = store;
storageArr.push(store);
} }
prepareChunks(storage, dimInfo, chunkSize, originalChunkCount, end); prepareChunks(storage, dimInfo, chunkSize, originalChunkCount, end);
...@@ -610,13 +622,9 @@ class List< ...@@ -610,13 +622,9 @@ class List<
this._chunkCount = storage[dim].length; this._chunkCount = storage[dim].length;
} }
const storageArr: DataValueChunk[][] = this._storageArr = []; const rawExtentArr = zrUtil.map(dimensions, (dim) => {
const rawExtentArr = []; return rawExtent[dim];
for (let k = 0; k < dimLen; k++) { });
const dim = dimensions[k];
storageArr.push(storage[dim]);
rawExtentArr.push(rawExtent[dim]);
}
let dataItem = [] as OptionDataItem; let dataItem = [] as OptionDataItem;
for (let idx = start; idx < end; idx++) { for (let idx = start; idx < end; idx++) {
...@@ -632,14 +640,14 @@ class List< ...@@ -632,14 +640,14 @@ class List<
const chunkOffset = idx % chunkSize; const chunkOffset = idx % chunkSize;
// Store the data by dimensions // Store the data by dimensions
for (let k = 0; k < dimLen; k++) { for (let dimIdx = 0; dimIdx < dimLen; dimIdx++) {
const dim = dimensions[k]; const dim = dimensions[dimIdx];
const dimStorage = storageArr[k][chunkIndex]; const dimStorage = storageArr[dimIdx][chunkIndex];
// PENDING NULL is empty or zero // 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; dimStorage[chunkOffset] = val;
const dimRawExtent = rawExtentArr[k]; const dimRawExtent = rawExtentArr[dimIdx];
val < dimRawExtent[0] && (dimRawExtent[0] = val); val < dimRawExtent[0] && (dimRawExtent[0] = val);
val > dimRawExtent[1] && (dimRawExtent[1] = val); val > dimRawExtent[1] && (dimRawExtent[1] = val);
} }
...@@ -741,6 +749,10 @@ class List< ...@@ -741,6 +749,10 @@ class List<
// Because in v8 access array by number variable is faster than access object by string variable // Because in v8 access array by number variable is faster than access object by string variable
// Not sure why but the optimization just works. // Not sure why but the optimization just works.
getByDimIdx(dimIdx: number, idx: number): ParsedValue { getByDimIdx(dimIdx: number, idx: number): ParsedValue {
if (!(idx >= 0 && idx < this._count)) {
return NaN;
}
const dimStore = this._storageArr[dimIdx]; const dimStore = this._storageArr[dimIdx];
const chunkSize = this._chunkSize; const chunkSize = this._chunkSize;
if (!dimStore) { if (!dimStore) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册