Skip to content

Commit

Permalink
[performance] replace helpers.each calls with for-loops
Browse files Browse the repository at this point in the history
  • Loading branch information
benmccann committed May 27, 2019
1 parent 70b32ff commit 6234f56
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 66 deletions.
19 changes: 14 additions & 5 deletions src/core/core.helpers.js
Expand Up @@ -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);
Expand All @@ -589,6 +594,10 @@ module.exports = function() {
}
return longest;
};

/**
* @deprecated
*/
helpers.numberOfLabelLines = function(arrayOfThings) {
var numberOfLines = 1;
helpers.each(arrayOfThings, function(thing) {
Expand Down
66 changes: 32 additions & 34 deletions src/scales/scale.linear.js
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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);
Expand All @@ -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) {
Expand All @@ -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;
Expand Down
53 changes: 26 additions & 27 deletions src/scales/scale.logarithmic.js
Expand Up @@ -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 datasetIndex, meta, value, data, i, ilen;

// Calculate Range
me.min = null;
Expand All @@ -86,24 +86,21 @@ module.exports = Scale.extend({

var hasStacks = opts.stacked;
if (hasStacks === undefined) {
helpers.each(datasets, function(dataset, datasetIndex) {
if (hasStacks) {
return;
}

var meta = chart.getDatasetMeta(datasetIndex);
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
Expand All @@ -116,18 +113,19 @@ module.exports = Scale.extend({
valuesPerStack[key] = [];
}

helpers.each(dataset.data, function(rawValue, index) {
data = datasets[datasetIndex].data;
for (i = 0, ilen = data.length; i < ilen; i++) {
var values = valuesPerStack[key];
var value = me._parseValue(rawValue);
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;
}
}
});
}

helpers.each(valuesPerStack, function(valuesForType) {
if (valuesForType.length > 0) {
Expand All @@ -139,14 +137,15 @@ module.exports = Scale.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]);
// 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) {
Expand All @@ -160,9 +159,9 @@ module.exports = Scale.extend({
if (value.min !== 0 && (me.minNotZero === null || value.min < me.minNotZero)) {
me.minNotZero = value.min;
}
});
}
}
});
}
}

// Common base implementation to handle ticks.min, ticks.max
Expand Down

0 comments on commit 6234f56

Please sign in to comment.