Skip to content

Commit b31980e

Browse files
benmccannetimberg
authored andcommitted
[performance] faster major tick calculation (#6307)
* [performance] faster major tick calculation * Address review comments * Replace isNaN
1 parent 9eecdf4 commit b31980e

File tree

1 file changed

+24
-5
lines changed

1 file changed

+24
-5
lines changed

src/scales/scale.time.js

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -404,21 +404,40 @@ function computeOffsets(table, ticks, min, max, options) {
404404
return {start: start, end: end};
405405
}
406406

407+
function setMajorTicks(scale, ticks, map, majorUnit) {
408+
var adapter = scale._adapter;
409+
var first = +adapter.startOf(ticks[0].value, majorUnit);
410+
var last = ticks[ticks.length - 1].value;
411+
var major, index;
412+
413+
for (major = first; major <= last; major = +adapter.add(major, 1, majorUnit)) {
414+
index = map[major];
415+
if (index >= 0) {
416+
ticks[index].major = true;
417+
}
418+
}
419+
return ticks;
420+
}
421+
407422
function ticksFromTimestamps(scale, values, majorUnit) {
408423
var ticks = [];
409-
var i, ilen, value, major;
424+
var map = {};
425+
var ilen = values.length;
426+
var i, value;
410427

411-
for (i = 0, ilen = values.length; i < ilen; ++i) {
428+
for (i = 0; i < ilen; ++i) {
412429
value = values[i];
413-
major = majorUnit ? value === +scale._adapter.startOf(value, majorUnit) : false;
430+
map[value] = i;
414431

415432
ticks.push({
416433
value: value,
417-
major: major
434+
major: false
418435
});
419436
}
420437

421-
return ticks;
438+
// We set the major ticks separately from the above loop because calling startOf for every tick
439+
// is expensive when there is a large number of ticks
440+
return (ilen === 0 || !majorUnit) ? ticks : setMajorTicks(scale, ticks, map, majorUnit);
422441
}
423442

424443
var defaultConfig = {

0 commit comments

Comments
 (0)