Remove createElement and pre-allocate arrays (#6788)

* Remove createElement and pre-allocate arrays

* Address review comment
This commit is contained in:
Ben McCann 2019-11-28 04:00:50 -08:00 committed by Evert Timberg
parent 090b5aee1f
commit 1f3cf3c28d
2 changed files with 50 additions and 45 deletions

View File

@ -70,6 +70,8 @@ Chart.js 3.0 introduces a number of breaking changes. Chart.js 2.0 was released
* `Chart.chart.chart`
* `Chart.types`
* `DatasetController.addElementAndReset`
* `DatasetController.createMetaData`
* `DatasetController.createMetaDataset`
* `Element.getArea`
* `Element.height`
* `Element.initialize`
@ -104,7 +106,6 @@ Chart.js 3.0 introduces a number of breaking changes. Chart.js 2.0 was released
* `helpers.log10` was renamed to `helpers.math.log10`
* `Chart.Animation.animationObject` was renamed to `Chart.Animation`
* `Chart.Animation.chartInstance` was renamed to `Chart.Animation.chart`
* `DatasetController.createMetaData` and `DatasetController.createMetaDataset` were replaced with `DatasetController.createElement`
* `DatasetController.updateElement` was renamed to `DatasetController.updateElements`
* `TimeScale.getLabelCapacity` was renamed to `TimeScale._getLabelCapacity`
* `TimeScale.tickFormatFunction` was renamed to `TimeScale._tickFormatFunction`

View File

@ -153,15 +153,15 @@ function applyStack(stack, value, dsIndex, allOther) {
}
function convertObjectDataToArray(data) {
var keys = Object.keys(data);
var adata = [];
var i, ilen, key;
const keys = Object.keys(data);
const adata = new Array(keys.length);
let i, ilen, key;
for (i = 0, ilen = keys.length; i < ilen; ++i) {
key = keys[i];
adata.push({
adata[i] = {
x: key,
y: data[key]
});
};
}
return adata;
}
@ -358,17 +358,13 @@ helpers.extend(DatasetController.prototype, {
}
},
createElement: function(type) {
return type && new type();
},
/**
* @private
*/
_dataCheck: function() {
var me = this;
var dataset = me.getDataset();
var data = dataset.data || (dataset.data = []);
const me = this;
const dataset = me.getDataset();
const data = dataset.data || (dataset.data = []);
// In order to correctly handle data addition/deletion animation (an thus simulate
// real-time charts), we need to monitor these data modifications and synchronize
@ -420,19 +416,21 @@ helpers.extend(DatasetController.prototype, {
},
addElements: function() {
var me = this;
var meta = me._cachedMeta;
var metaData = meta.data;
var i, ilen, data;
const me = this;
const meta = me._cachedMeta;
let i, ilen, data;
me._dataCheck();
data = me._data;
const metaData = meta.data = new Array(data.length);
for (i = 0, ilen = data.length; i < ilen; ++i) {
metaData[i] = metaData[i] || me.createElement(me.dataElementType);
metaData[i] = new me.dataElementType();
}
meta.dataset = meta.dataset || me.createElement(me.datasetElementType);
if (me.datasetElementType) {
meta.dataset = new me.datasetElementType();
}
},
buildOrUpdateElements: function() {
@ -516,14 +514,15 @@ helpers.extend(DatasetController.prototype, {
const vId = vScale.id;
const labels = iScale._getLabels();
const singleScale = iScale === vScale;
const parsed = [];
let i, ilen, item;
const parsed = new Array(count);
let i, ilen, index;
for (i = start, ilen = start + count; i < ilen; ++i) {
item = {};
item[iId] = singleScale || iScale._parse(labels[i], i);
item[vId] = vScale._parse(data[i], i);
parsed.push(item);
for (i = 0, ilen = count; i < ilen; ++i) {
index = i + start;
parsed[i] = {
[iId]: singleScale || iScale._parse(labels[index], index),
[vId]: vScale._parse(data[index], index)
};
}
return parsed;
},
@ -543,14 +542,16 @@ helpers.extend(DatasetController.prototype, {
const {xScale, yScale} = meta;
const xId = xScale.id;
const yId = yScale.id;
const parsed = [];
let i, ilen, item;
for (i = start, ilen = start + count; i < ilen; ++i) {
item = data[i];
parsed.push({
[xId]: xScale._parse(item[0], i),
[yId]: yScale._parse(item[1], i)
});
const parsed = new Array(count);
let i, ilen, index, item;
for (i = 0, ilen = count; i < ilen; ++i) {
index = i + start;
item = data[index];
parsed[i] = {
[xId]: xScale._parse(item[0], index),
[yId]: yScale._parse(item[1], index)
};
}
return parsed;
},
@ -570,14 +571,16 @@ helpers.extend(DatasetController.prototype, {
const {xScale, yScale} = meta;
const xId = xScale.id;
const yId = yScale.id;
const parsed = [];
let i, ilen, item;
for (i = start, ilen = start + count; i < ilen; ++i) {
item = data[i];
parsed.push({
[xId]: xScale._parseObject(item, 'x', i),
[yId]: yScale._parseObject(item, 'y', i)
});
const parsed = new Array(count);
let i, ilen, index, item;
for (i = 0, ilen = count; i < ilen; ++i) {
index = i + start;
item = data[index];
parsed[i] = {
[xId]: xScale._parseObject(item, 'x', index),
[yId]: yScale._parseObject(item, 'y', index)
};
}
return parsed;
},
@ -958,14 +961,15 @@ helpers.extend(DatasetController.prototype, {
*/
insertElements: function(start, count) {
const me = this;
const elements = [];
const elements = new Array(count);
const data = me._cachedMeta.data;
let i;
for (i = start; i < start + count; ++i) {
elements.push(me.createElement(me.dataElementType));
for (i = 0; i < count; ++i) {
elements[i] = new me.dataElementType();
}
data.splice(start, 0, ...elements);
me._parse(start, count);
me.updateElements(data, start, count);
},