From b4ceb75be03f017ad76b231b7fa8c845815e77d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philippe=20Rivi=C3=A8re?= Date: Tue, 13 Jul 2021 18:32:53 +0200 Subject: [PATCH] make bins faster by quantization ref. https://github.com/observablehq/plot/issues/454 --- src/bin.js | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/bin.js b/src/bin.js index 2bd96850..bb33c3ce 100644 --- a/src/bin.js +++ b/src/bin.js @@ -18,6 +18,7 @@ export default function bin() { var i, n = data.length, x, + step, values = new Array(n); for (i = 0; i < n; ++i) { @@ -45,7 +46,7 @@ export default function bin() { // compare order (>=) rather than strict equality (===)! if (tz[tz.length - 1] >= x1) { if (max >= x1 && domain === extent) { - const step = tickIncrement(x0, x1, tn); + step = tickIncrement(x0, x1, tn); if (isFinite(step)) { if (step > 0) { x1 = (Math.floor(x1 / step) + 1) * step; @@ -75,10 +76,20 @@ export default function bin() { } // Assign data to bins by value, ignoring any outside the domain. - for (i = 0; i < n; ++i) { - x = values[i]; - if (x != null && x0 <= x && x <= x1) { - bins[bisect(tz, x, 0, m)].push(data[i]); + if (step && isFinite(step)) { + step = step < 0 ? -step : 1 / step; + for (i = 0; i < n; ++i) { + x = values[i]; + if (x != null && x0 <= x && x <= x1) { + bins[Math.floor((x - x0) * step)].push(data[i]); + } + } + } else { + for (i = 0; i < n; ++i) { + x = values[i]; + if (x != null && x0 <= x && x <= x1) { + bins[bisect(tz, x, 0, m)].push(data[i]); + } } }