Perf: make sort domain faster

This commit is contained in:
SukkaW 2024-05-11 10:39:24 +08:00
parent 22d738d99d
commit 1b116637d2
3 changed files with 8 additions and 39 deletions

View File

@ -1,5 +1,4 @@
import { fetchRemoteTextByLine } from './fetch-text-by-line';
import { getGorhillPublicSuffixPromise } from './get-gorhill-publicsuffix';
import { processLineFromReadline } from './process-line';
import { sortDomains } from './stable-sort-domain';

View File

@ -1,21 +1,7 @@
// eslint-disable-next-line import-x/no-unresolved -- bun
import { describe, expect, it } from 'bun:test';
import { compare, sortDomains } from './stable-sort-domain';
describe('compare', () => {
it('basic', () => {
expect(
compare('.s3-website.ap-northeast-3.amazonaws.com', '.s3.dualstack.ap-south-1.amazonaws.com')
).toBe(1);
});
it('basic', () => {
expect(
compare('.s3-website.ap-northeast-3.amazonaws.com', '.s3.dualstack.ap-south-1.amazonaws.com')
).toBe(1);
});
});
import { sortDomains } from './stable-sort-domain';
describe('sortDomains', () => {
it('basic', () => {

View File

@ -6,36 +6,20 @@ export const compare = (a: string, b: string) => {
const aLen = a.length;
const r = aLen - b.length;
if (r > 0) {
return 1;
}
if (r < 0) {
return -1;
}
if (r !== 0) return r;
for (let i = 0; i < aLen; i++) {
// if (b[i] == null) {
// return 1;
// }
if (a[i] < b[i]) {
return -1;
}
if (a[i] > b[i]) {
return 1;
}
}
return 0;
return a.localeCompare(b);
};
const tldtsOpt = { allowPrivateDomains: false, detectIp: false, validateHostname: false };
export const sortDomains = (inputs: string[]) => {
const domains = inputs.reduce<Map<string, string>>((acc, cur) => {
if (!acc.has(cur)) {
const domains = inputs.reduce<Map<string, string>>((domains, cur) => {
if (!domains.has(cur)) {
const topD = tldts.getDomain(cur, tldtsOpt);
acc.set(cur, topD ?? cur);
domains.set(cur, topD ?? cur);
};
return acc;
return domains;
}, new Map());
const sorter = (a: string, b: string) => {
@ -47,7 +31,7 @@ export const sortDomains = (inputs: string[]) => {
if (a === $a && b === $b) {
return compare(a, b);
}
return compare($a, $b) || compare(a, b);
return $a.localeCompare($b) || compare(a, b);
};
sort(inputs, sorter);