From 3b0b50288f59ee502ab08fa2f3269548fd579915 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Sun, 26 May 2019 21:27:29 -0700 Subject: [PATCH] [performance] replace helpers.each calls with for-loops --- src/core/core.helpers.js | 19 +++++++--- src/scales/scale.linear.js | 66 ++++++++++++++++----------------- src/scales/scale.logarithmic.js | 30 ++++++++------- 3 files changed, 62 insertions(+), 53 deletions(-) diff --git a/src/core/core.helpers.js b/src/core/core.helpers.js index 52c8aea68a8..31748758090 100644 --- a/src/core/core.helpers.js +++ b/src/core/core.helpers.js @@ -553,25 +553,30 @@ module.exports = function() { ctx.font = font; var longest = 0; - helpers.each(arrayOfThings, function(thing) { + var ilen = arrayOfThings.length; + var i, j, jlen, thing, nestedThing; + for (i = 0; i < ilen; i++) { + thing = arrayOfThings[i]; + // Undefined strings and arrays should not be measured if (thing !== undefined && thing !== null && helpers.isArray(thing) !== true) { longest = helpers.measureText(ctx, data, gc, longest, thing); } else if (helpers.isArray(thing)) { // if it is an array lets measure each element // to do maybe simplify this function a bit so we can do this more recursively? - helpers.each(thing, function(nestedThing) { + for (j = 0, jlen = thing.length; j < jlen; j++) { + nestedThing = thing[j]; // Undefined strings and arrays should not be measured if (nestedThing !== undefined && nestedThing !== null && !helpers.isArray(nestedThing)) { longest = helpers.measureText(ctx, data, gc, longest, nestedThing); } - }); + } } - }); + } var gcLen = gc.length / 2; if (gcLen > arrayOfThings.length) { - for (var i = 0; i < gcLen; i++) { + for (i = 0; i < gcLen; i++) { delete data[gc[i]]; } gc.splice(0, gcLen); @@ -589,6 +594,10 @@ module.exports = function() { } return longest; }; + + /** + * @deprecated + */ helpers.numberOfLabelLines = function(arrayOfThings) { var numberOfLines = 1; helpers.each(arrayOfThings, function(thing) { diff --git a/src/scales/scale.linear.js b/src/scales/scale.linear.js index c9ce8709ded..f54a3eea816 100644 --- a/src/scales/scale.linear.js +++ b/src/scales/scale.linear.js @@ -16,14 +16,14 @@ module.exports = LinearScaleBase.extend({ var me = this; var opts = me.options; var chart = me.chart; - var data = chart.data; - var datasets = data.datasets; + var datasets = chart.data.datasets; var isHorizontal = me.isHorizontal(); var DEFAULT_MIN = 0; var DEFAULT_MAX = 1; + var datasetIndex, meta, value, data, i, ilen; - function IDMatches(meta) { - return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id; + function IDMatches(scaleMeta) { + return isHorizontal ? scaleMeta.xAxisID === me.id : scaleMeta.yAxisID === me.id; } // First Calculate the range @@ -32,24 +32,20 @@ module.exports = LinearScaleBase.extend({ var hasStacks = opts.stacked; if (hasStacks === undefined) { - helpers.each(datasets, function(dataset, datasetIndex) { - if (hasStacks) { - return; - } - - var meta = chart.getDatasetMeta(datasetIndex); - if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) && - meta.stack !== undefined) { + for (datasetIndex = 0; datasetIndex < datasets.length; datasetIndex++) { + meta = chart.getDatasetMeta(datasetIndex); + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) && meta.stack !== undefined) { hasStacks = true; + break; } - }); + } } if (opts.stacked || hasStacks) { var valuesPerStack = {}; - helpers.each(datasets, function(dataset, datasetIndex) { - var meta = chart.getDatasetMeta(datasetIndex); + for (datasetIndex = 0; datasetIndex < datasets.length; datasetIndex++) { + meta = chart.getDatasetMeta(datasetIndex); var key = [ meta.type, // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined @@ -69,30 +65,31 @@ module.exports = LinearScaleBase.extend({ var negativeValues = valuesPerStack[key].negativeValues; if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { - helpers.each(dataset.data, function(rawValue, index) { - var value = me._parseValue(rawValue); + data = datasets[datasetIndex].data; + for (i = 0, ilen = data.length; i < ilen; i++) { + value = me._parseValue(data[i]); - if (isNaN(value.min) || isNaN(value.max) || meta.data[index].hidden) { - return; + if (isNaN(value.min) || isNaN(value.max) || meta.data[i].hidden) { + continue; } - positiveValues[index] = positiveValues[index] || 0; - negativeValues[index] = negativeValues[index] || 0; + positiveValues[i] = positiveValues[i] || 0; + negativeValues[i] = negativeValues[i] || 0; if (value.min === 0 && !opts.ticks.beginAtZero) { value.min = value.max; } if (opts.relativePoints) { - positiveValues[index] = 100; + positiveValues[i] = 100; } else if (value.min < 0 || value.max < 0) { - negativeValues[index] += value.min; + negativeValues[i] += value.min; } else { - positiveValues[index] += value.max; + positiveValues[i] += value.max; } - }); + } } - }); + } helpers.each(valuesPerStack, function(valuesForType) { var values = valuesForType.positiveValues.concat(valuesForType.negativeValues); @@ -103,14 +100,15 @@ module.exports = LinearScaleBase.extend({ }); } else { - helpers.each(datasets, function(dataset, datasetIndex) { - var meta = chart.getDatasetMeta(datasetIndex); + for (datasetIndex = 0; datasetIndex < datasets.length; datasetIndex++) { + meta = chart.getDatasetMeta(datasetIndex); if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { - helpers.each(dataset.data, function(rawValue, index) { - var value = me._parseValue(rawValue); + data = datasets[datasetIndex].data; + for (i = 0, ilen = data.length; i < ilen; i++) { + value = me._parseValue(data[i]); - if (isNaN(value.min) || isNaN(value.max) || meta.data[index].hidden) { - return; + if (isNaN(value.min) || isNaN(value.max) || meta.data[i].hidden) { + continue; } if (me.min === null || value.min < me.min) { @@ -120,9 +118,9 @@ module.exports = LinearScaleBase.extend({ if (me.max === null || me.max < value.max) { me.max = value.max; } - }); + } } - }); + } } me.min = isFinite(me.min) && !isNaN(me.min) ? me.min : DEFAULT_MIN; diff --git a/src/scales/scale.logarithmic.js b/src/scales/scale.logarithmic.js index 3e9b2849f0b..c3c7c74ffd3 100644 --- a/src/scales/scale.logarithmic.js +++ b/src/scales/scale.logarithmic.js @@ -72,12 +72,12 @@ module.exports = Scale.extend({ var me = this; var opts = me.options; var chart = me.chart; - var data = chart.data; - var datasets = data.datasets; + var datasets = chart.data.datasets; var isHorizontal = me.isHorizontal(); function IDMatches(meta) { return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id; } + var i, ilen, data; // Calculate Range me.min = null; @@ -116,16 +116,17 @@ module.exports = Scale.extend({ valuesPerStack[key] = []; } - helpers.each(dataset.data, function(rawValue, index) { + data = dataset.data; + for (i = 0, ilen = data.length; i < ilen; i++) { var values = valuesPerStack[key]; - var value = me._parseValue(rawValue); + var value = me._parseValue(data[i]); // invalid, hidden and negative values are ignored - if (isNaN(value.min) || isNaN(value.max) || meta.data[index].hidden || value.min < 0 || value.max < 0) { - return; + if (isNaN(value.min) || isNaN(value.max) || meta.data[i].hidden || value.min < 0 || value.max < 0) { + continue; } - values[index] = values[index] || 0; - values[index] += value.max; - }); + values[i] = values[i] || 0; + values[i] += value.max; + } } }); @@ -142,11 +143,12 @@ module.exports = Scale.extend({ helpers.each(datasets, function(dataset, datasetIndex) { var meta = chart.getDatasetMeta(datasetIndex); if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { - helpers.each(dataset.data, function(rawValue, index) { - var value = me._parseValue(rawValue); + data = dataset.data; + for (i = 0, ilen = data.length; i < ilen; i++) { + var value = me._parseValue(data[i]); // invalid, hidden and negative values are ignored - if (isNaN(value.min) || isNaN(value.max) || meta.data[index].hidden || value.min < 0 || value.max < 0) { - return; + if (isNaN(value.min) || isNaN(value.max) || meta.data[i].hidden || value.min < 0 || value.max < 0) { + continue; } if (me.min === null || value.min < me.min) { @@ -160,7 +162,7 @@ module.exports = Scale.extend({ if (value.min !== 0 && (me.minNotZero === null || value.min < me.minNotZero)) { me.minNotZero = value.min; } - }); + } } }); }