diff --git a/Build/lib/cache-filesystem.ts b/Build/lib/cache-filesystem.ts index f38e8d5a..2cb0c599 100644 --- a/Build/lib/cache-filesystem.ts +++ b/Build/lib/cache-filesystem.ts @@ -4,6 +4,7 @@ import os from 'os'; import path from 'path'; import { mkdirSync } from 'fs'; import picocolors from 'picocolors'; +import { fastStringArrayJoin } from './misc'; const identity = (x: any) => x; @@ -215,7 +216,7 @@ const separator = '\u0000'; // const textDecoder = new TextDecoder(); // export const serializeString = (str: string) => textEncoder.encode(str); // export const deserializeString = (str: string) => textDecoder.decode(new Uint8Array(str.split(separator).map(Number))); -export const serializeSet = (set: Set) => Array.from(set).join(separator); +export const serializeSet = (set: Set) => fastStringArrayJoin(Array.from(set), separator); export const deserializeSet = (str: string) => new Set(str.split(separator)); -export const serializeArray = (arr: string[]) => arr.join(separator); +export const serializeArray = (arr: string[]) => fastStringArrayJoin(arr, separator); export const deserializeArray = (str: string) => str.split(separator); diff --git a/Build/lib/create-file.ts b/Build/lib/create-file.ts index 0b8faa99..e8d911a1 100644 --- a/Build/lib/create-file.ts +++ b/Build/lib/create-file.ts @@ -5,6 +5,7 @@ import picocolors from 'picocolors'; import type { Span } from '../trace'; import path from 'path'; import { sort } from './timsort'; +import { fastStringArrayJoin } from './misc'; export async function compareAndWriteFile(span: Span, linesA: string[], filePath: string) { let isEqual = true; @@ -69,7 +70,7 @@ export async function compareAndWriteFile(span: Span, linesA: string[], filePath await span.traceChildAsync(`writing ${filePath}`, async () => { // if (linesALen < 10000) { - return Bun.write(file, `${linesA.join('\n')}\n`); + return Bun.write(file, fastStringArrayJoin(linesA, '\n') + '\n'); // } // const writer = file.writer(); diff --git a/Build/lib/misc.ts b/Build/lib/misc.ts index 7744f7e3..40b07e89 100644 --- a/Build/lib/misc.ts +++ b/Build/lib/misc.ts @@ -1 +1,18 @@ export const isTruthy = (i: T | 0 | '' | false | null | undefined): i is T => !!i; + +export const fastStringArrayJoin = (arr: string[], sep: string) => { + let result = ''; + for (let i = 0, len = arr.length; i < len; i++) { + if (i !== 0) { + result += sep; + } + result += arr[i]; + } + return result; +}; + +export const fastStringArrayJoin2 = (arr: string[], sep: string) => { + return arr.reduce((acc, cur, index) => { + return index === 0 ? cur : acc + sep + cur; + }, ''); +}; diff --git a/Build/lib/trie.ts b/Build/lib/trie.ts index 42639935..39c67b6d 100644 --- a/Build/lib/trie.ts +++ b/Build/lib/trie.ts @@ -2,6 +2,8 @@ * Suffix Trie based on Mnemonist Trie */ +import { fastStringArrayJoin } from './misc'; + // const { Error, Bun, JSON, Symbol } = globalThis; const noop = () => { /** noop */ }; @@ -262,7 +264,7 @@ export const createTrie = (from?: string[] | Set | null, hostnameMode = inputTokens ); - return hostnameMode ? matches.map((m) => (m as string[]).join('')) : matches as string[]; + return hostnameMode ? matches.map((m) => fastStringArrayJoin(m as string[], '')) : matches as string[]; }; /** @@ -279,7 +281,7 @@ export const createTrie = (from?: string[] | Set | null, hostnameMode = if (res === null) return; const onMatches = hostnameMode - ? (suffix: string[]) => set.delete(suffix.join('')) + ? (suffix: string[]) => set.delete(fastStringArrayJoin(suffix, '')) : (suffix: string) => set.delete(suffix); walk( @@ -327,7 +329,7 @@ export const createTrie = (from?: string[] | Set | null, hostnameMode = walk(suffix => { results.push( - isHostnameMode(suffix) ? suffix.join('') : suffix + isHostnameMode(suffix) ? fastStringArrayJoin(suffix, '') : suffix ); });