JSFiddle - React, Tailwind, and code Playground
JavaScript
var log = (function(p) {
return function(line) {
p.appendChild(document.createTextNode(line));
p.appendChild(document.createElement("br"));
};
})(document.getElementById("log"));
// Benchmarking 3 versions at different N
for(var N = 20000; N <= 80000; N *= 2) {
var arr = (function generateData(n) {
var result = [];
for(var i = 0; i < n; ++i) {
var a = i % 60;
result.push({
id: i,
sex: i % 2,
sexPref: ((i % 7) != 0) ? ((i + 1) % 2) : (i % 2),
isSingle: (7 * i + 23) % 4 < 2,
isAvailable: (19 * i + 53) % 8 < 2,
// generates a number in (18, 77)
age: ((a+5) * (a+5)) / 70 + 17.65,
});
}
return result;
})(N);
function bruteforce(arr) {
var matches = [];
for(var i = 0; i < arr.length; ++i) {
var candidate = arr[i], num = 12;
var isCandidate = !candidate.isSingle && candidate.isAvailable && candidate.sex == 1;
var cSex = candidate.sex;
var cSexPref = candidate.sexPref;
var cAgeMin = candidate.age - num;
var cAgeMax = candidate.age + num;
var result = !isCandidate ? -1 : arr.reduce(function(p,c,k,a){
return k != i &&
c.sex == cSexPref &&
c.sexPref == cSex &&
!c.isSingle && c.isAvailable &&
c.age <= cAgeMax &&
c.age >= cAgeMin ? k : p;
}, -1);
if(isCandidate)
matches.push([i, result]);
}
return matches;
}
function useTheCategory(arr) {
// some overhead for the preprocessing...
var wmNonsingleAvailables = [];
var wwNonsingleAvailables = [];
var mwNonsingleAvailables = [];
var mmNonsingleAvailables = [];
arr.forEach(function(c) {
// we don't care about singles and unavailables
if(!c.isSingle && c.isAvailable) {
if(c.sex == 0) {
if(c.sexPref == 1)
wmNonsingleAvailables.push(c);
else
wwNonsingleAvailables.push(c);
} else {
if(c.sexPref == 0)
mwNonsingleAvailables.push(c);
else
...