From 61035df4a80264b2bd77ab634ec97bdb623b309a Mon Sep 17 00:00:00 2001 From: SukkaW Date: Mon, 5 Sep 2022 14:13:07 +0800 Subject: [PATCH] Perf: improve reject set dedupe worker performance --- Build/build-reject-domainset.js | 23 +++++++++++++++---- Build/worker/build-reject-domainset-worker.js | 15 ++++++------ 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/Build/build-reject-domainset.js b/Build/build-reject-domainset.js index 404720ff..ceb6fae6 100644 --- a/Build/build-reject-domainset.js +++ b/Build/build-reject-domainset.js @@ -198,6 +198,17 @@ const threads = require('os').cpus().length - 1; workerData: [...domainSets] }); + console.log(`Launching ${threads} threads...`) + + const tasksArray = Array.from(domainSets) + .reduce((result, element, index) => { + const chunk = index % threads; + result[chunk] ??= []; + + result[chunk].push(element); + return result; + }, []); + (await Promise.all( Array.from(domainSets) .reduce((result, element, index) => { @@ -208,11 +219,15 @@ const threads = require('os').cpus().length - 1; return result; }, []) .map(chunk => piscina.run( - { chunk }, - { name: 'dedupe' } + { chunk } )) - )).forEach(set => { - set.forEach(i => domainSets.delete(i)); + )).forEach((result, taskIndex) => { + const chunk = tasksArray[taskIndex]; + result.forEach((value, index) => { + if (value === 1) { + domainSets.delete(chunk[index]) + } + }) }); console.log(`Deduped ${previousSize - domainSets.size} rules!`); diff --git a/Build/worker/build-reject-domainset-worker.js b/Build/worker/build-reject-domainset-worker.js index cf14286f..f15452a1 100644 --- a/Build/worker/build-reject-domainset-worker.js +++ b/Build/worker/build-reject-domainset-worker.js @@ -1,11 +1,12 @@ -const { workerData } = require('piscina'); +const { workerData, move } = require('piscina'); const len = workerData.length; -exports.dedupe = ({ chunk }) => { - const outputToBeRemoved = new Set(); +module.exports = ({ chunk }) => { + const chunkLength = chunk.length; + const outputToBeRemoved = new Int32Array(chunkLength); - for (let i = 0, l = chunk.length; i < l; i++) { + for (let i = 0; i < chunkLength; i++) { const domainFromInput = chunk[i]; for (let j = 0; j < len; j++) { @@ -26,7 +27,7 @@ exports.dedupe = ({ chunk }) => { } if (shouldBeRemoved) { - outputToBeRemoved.add(domainFromInput); + outputToBeRemoved[i] = 1; break; } } @@ -34,12 +35,12 @@ exports.dedupe = ({ chunk }) => { if (domainFromInput.length >= domainFromFullSet.length) { if (domainFromInput.endsWith(domainFromFullSet)) { - outputToBeRemoved.add(domainFromInput); + outputToBeRemoved[i] = 1; break; } } } } - return outputToBeRemoved; + return move(outputToBeRemoved); };