Reduce object creation during parsing (#6758)

* Reduce object creation during parsing
* Rename method to createElement
* Make code more efficient?
* Update migration guide
This commit is contained in:
Ben McCann 2019-11-17 15:01:31 -08:00 committed by Evert Timberg
parent 4b4b4b79e1
commit f5b2b8db64
3 changed files with 25 additions and 33 deletions

View File

@ -65,18 +65,19 @@ Chart.js 3.0 introduces a number of breaking changes. Chart.js 2.0 was released
* `helpers.removeEvent`
* `helpers.roundedRect`
* `helpers.scaleMerge`
* `Scale.getRightValue`
* `Scale.mergeTicksOptions`
* `Scale.ticksAsNumbers`
* `Chart.Controller`
* `Chart.chart.chart`
* `Chart.types`
* `Line.calculatePointY`
* `DatasetController.addElementAndReset`
* `Element.getArea`
* `Element.height`
* `Element.inLabelRange`
* Made `scale.handleDirectionalChanges` private
* Made `scale.tickValues` private
* `Line.calculatePointY`
* `Scale.getRightValue`
* `Scale.mergeTicksOptions`
* `Scale.ticksAsNumbers`
* `Scale.handleDirectionalChanges` is now private
* `Scale.tickValues` is now private
#### Removal of private APIs
@ -95,6 +96,7 @@ 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`
* `TimeScale.getLabelCapacity` was renamed to `TimeScale._getLabelCapacity`
* `TimeScale.tickFormatFunction` was renamed to `TimeScale._tickFormatFunction`
* `TimeScale.getPixelForOffset` was renamed to `TimeScale._getPixelForOffset`

View File

@ -143,7 +143,7 @@ module.exports = DatasetController.extend({
var metaData = this.getMeta().data;
var i, ilen;
for (i = start, ilen = start + count; i < ilen; ++i) {
metaData[i]._val = +data[i];
metaData[i]._parsed = +data[i];
}
},
@ -232,7 +232,7 @@ module.exports = DatasetController.extend({
var centerY = (chartArea.top + chartArea.bottom) / 2;
var startAngle = opts.rotation; // non reset case handled later
var endAngle = opts.rotation; // non reset case handled later
var circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(arc._val * opts.circumference / DOUBLE_PI);
var circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(arc._parsed * opts.circumference / DOUBLE_PI);
var innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius;
var outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius;
var options = arc._options || {};
@ -276,7 +276,7 @@ module.exports = DatasetController.extend({
var value;
helpers.each(metaData, function(arc) {
value = arc ? arc._val : NaN;
value = arc ? arc._parsed : NaN;
if (!isNaN(value) && !arc.hidden) {
total += Math.abs(value);
}

View File

@ -327,20 +327,9 @@ helpers.extend(DatasetController.prototype, {
}
},
createMetaDataset: function() {
var me = this;
var type = me.datasetElementType;
createElement: function(type) {
return type && new type({
_ctx: me.chart.ctx
});
},
createMetaData: function() {
var me = this;
var type = me.dataElementType;
return type && new type({
_ctx: me.chart.ctx,
_parsed: {}
_ctx: this.chart.ctx
});
},
@ -411,16 +400,10 @@ helpers.extend(DatasetController.prototype, {
data = me._data;
for (i = 0, ilen = data.length; i < ilen; ++i) {
metaData[i] = metaData[i] || me.createMetaData();
metaData[i] = metaData[i] || me.createElement(me.dataElementType);
}
meta.dataset = meta.dataset || me.createMetaDataset();
},
addElementAndReset: function(index) {
var element = this.createMetaData();
this._cachedMeta.data.splice(index, 0, element);
this.updateElement(element, index, true);
meta.dataset = meta.dataset || me.createElement(me.datasetElementType);
},
buildOrUpdateElements: function() {
@ -973,10 +956,17 @@ helpers.extend(DatasetController.prototype, {
* @private
*/
insertElements: function(start, count) {
for (var i = 0; i < count; ++i) {
this.addElementAndReset(start + i);
const me = this;
const elements = [];
var i;
for (i = start; i < start + count; ++i) {
elements.push(me.createElement(me.dataElementType));
}
me._cachedMeta.data.splice(start, 0, ...elements);
me._parse(start, count);
for (i = 0; i < count; ++i) {
me.updateElement(elements[i], start + i, true);
}
this._parse(start, count);
},
/**