Browse Source

Perf: append large array

SukkaW 1 year ago
parent
commit
1c95540b81

+ 2 - 1
Build/build-cdn-download-conf.ts

@@ -6,6 +6,7 @@ import { task } from './trace';
 import { SHARED_DESCRIPTION } from './lib/constants';
 import { getPublicSuffixListTextPromise } from './lib/download-publicsuffixlist';
 import { domainDeduper } from './lib/domain-deduper';
+import { appendArrayInPlace } from './lib/append-array-in-place';
 
 const getS3OSSDomainsPromise = (async (): Promise<Set<string>> => {
   const trie = createTrie((await getPublicSuffixListTextPromise()).split('\n'));
@@ -56,7 +57,7 @@ export const buildCdnDownloadConf = task(import.meta.path, async (span) => {
     readFileIntoProcessedArray(path.resolve(import.meta.dir, '../Source/domainset/steam.conf'))
   ]);
 
-  cdnDomainsList.push(...Array.from(S3OSSDomains).map((domain) => `.${domain}`));
+  appendArrayInPlace(cdnDomainsList, Array.from(S3OSSDomains).map((domain) => `.${domain}`));
 
   return Promise.all([
     createRuleset(

+ 3 - 1
Build/build-reject-ip-list.ts

@@ -8,6 +8,7 @@ import { isProbablyIpv4, isProbablyIpv6 } from './lib/is-fast-ip';
 import { TTL, deserializeArray, fsFetchCache, serializeArray } from './lib/cache-filesystem';
 import { fetchAssets } from './lib/fetch-assets';
 import { processLine } from './lib/process-line';
+import { appendArrayInPlace } from './lib/append-array-in-place';
 
 const BOGUS_NXDOMAIN_URL = 'https://raw.githubusercontent.com/felixonmars/dnsmasq-china-list/master/bogus-nxdomain.china.conf';
 
@@ -70,7 +71,8 @@ export const buildRejectIPList = task(import.meta.path, async (span) => {
   const bogusNxDomainIPs = await span.traceChildPromise('get bogus nxdomain ips', getBogusNxDomainIPsPromise);
   const botNetIPs = await span.traceChildPromise('get botnet ips', getBotNetFilterIPsPromise);
 
-  result.push(...bogusNxDomainIPs, ...botNetIPs);
+  appendArrayInPlace(result, bogusNxDomainIPs);
+  appendArrayInPlace(result, botNetIPs);
 
   const description = [
     ...SHARED_DESCRIPTION,

+ 21 - 0
Build/lib/append-array-in-place.ts

@@ -0,0 +1,21 @@
+const MAX_BLOCK_SIZE = 65535; // max parameter array size for use in Webkit
+
+export function appendArrayInPlace<T>(dest: T[], source: T[]) {
+  let offset = 0;
+  let itemsLeft = source.length;
+
+  if (itemsLeft <= MAX_BLOCK_SIZE) {
+    // eslint-disable-next-line prefer-spread -- performance
+    dest.push.apply(dest, source);
+  } else {
+    while (itemsLeft > 0) {
+      const pushCount = Math.min(MAX_BLOCK_SIZE, itemsLeft);
+      const subSource = source.slice(offset, offset + pushCount);
+      // eslint-disable-next-line prefer-spread -- performance
+      dest.push.apply(dest, subSource);
+      itemsLeft -= pushCount;
+      offset += pushCount;
+    }
+  }
+  return dest;
+}