diff --git a/benchmark.ts b/benchmark.ts new file mode 100644 index 0000000..f347eb9 --- /dev/null +++ b/benchmark.ts @@ -0,0 +1,118 @@ +import { bench, run } from "mitata"; + +// Dummy data generator +const generateData = (count: number) => { + return Array.from({ length: count }, (_, i) => ({ + id: i, + name: `Item ${i}`, + deps: i % 2 === 0 ? { 'foo': 'bar' } : null, + })); +}; + +const smallData = generateData(10); +const mediumData = generateData(100); +const largeData = generateData(10000); + +bench("Filter + Map (Small)", () => { + smallData + .filter((v) => !!v.deps) + .map((v) => ({ + key: `v_${v.id}`, + label: v.name, + })); +}); + +bench("Reduce (Small)", () => { + smallData.reduce((acc, v) => { + if (v.deps) { + acc.push({ + key: `v_${v.id}`, + label: v.name, + }); + } + return acc; + }, [] as any[]); +}); + +bench("FlatMap (Small)", () => { + smallData.flatMap((v) => + v.deps + ? [ + { + key: `v_${v.id}`, + label: v.name, + }, + ] + : [] + ); +}); + +bench("Filter + Map (Medium)", () => { + mediumData + .filter((v) => !!v.deps) + .map((v) => ({ + key: `v_${v.id}`, + label: v.name, + })); +}); + +bench("Reduce (Medium)", () => { + mediumData.reduce((acc, v) => { + if (v.deps) { + acc.push({ + key: `v_${v.id}`, + label: v.name, + }); + } + return acc; + }, [] as any[]); +}); + +bench("FlatMap (Medium)", () => { + mediumData.flatMap((v) => + v.deps + ? [ + { + key: `v_${v.id}`, + label: v.name, + }, + ] + : [] + ); +}); + +bench("Filter + Map (Large)", () => { + largeData + .filter((v) => !!v.deps) + .map((v) => ({ + key: `v_${v.id}`, + label: v.name, + })); +}); + +bench("Reduce (Large)", () => { + largeData.reduce((acc, v) => { + if (v.deps) { + acc.push({ + key: `v_${v.id}`, + label: v.name, + }); + } + return acc; + }, [] as any[]); +}); + +bench("FlatMap (Large)", () => { + largeData.flatMap((v) => + v.deps + ? [ + { + key: `v_${v.id}`, + label: v.name, + }, + ] + : [] + ); +}); + +await run(); diff --git a/bun.lock b/bun.lock index 002a71f..6376409 100644 --- a/bun.lock +++ b/bun.lock @@ -1,6 +1,5 @@ { "lockfileVersion": 1, - "configVersion": 0, "workspaces": { "": { "name": "pushy-admin", @@ -32,6 +31,7 @@ "@types/react": "^19", "@types/react-dom": "^19", "@types/react-router-dom": "^5.3.3", + "mitata": "^1.0.34", "tailwindcss": "^4.2.1", "typescript": "^5.9.3", }, @@ -883,6 +883,8 @@ "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + "mitata": ["mitata@1.0.34", "", {}, "sha512-Mc3zrtNBKIMeHSCQ0XqRLo1vbdIx1wvFV9c8NJAiyho6AjNfMY8bVhbS12bwciUdd1t4rj8099CH3N3NFahaUA=="], + "ml-array-max": ["ml-array-max@1.2.4", "", { "dependencies": { "is-any-array": "^2.0.0" } }, "sha512-BlEeg80jI0tW6WaPyGxf5Sa4sqvcyY6lbSn5Vcv44lp1I2GR6AWojfUvLnGTNsIXrZ8uqWmo8VcG1WpkI2ONMQ=="], "ml-array-min": ["ml-array-min@1.2.3", "", { "dependencies": { "is-any-array": "^2.0.0" } }, "sha512-VcZ5f3VZ1iihtrGvgfh/q0XlMobG6GQ8FsNyQXD3T+IlstDv85g8kfV0xUG1QPRO/t21aukaJowDzMTc7j5V6Q=="], diff --git a/package.json b/package.json index a39e425..3ab226e 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "@types/react": "^19", "@types/react-dom": "^19", "@types/react-router-dom": "^5.3.3", + "mitata": "^1.0.34", "tailwindcss": "^4.2.1", "typescript": "^5.9.3" }, diff --git a/src/pages/manage/components/deps-table.tsx b/src/pages/manage/components/deps-table.tsx index 7c1f704..fd67a59 100644 --- a/src/pages/manage/components/deps-table.tsx +++ b/src/pages/manage/components/deps-table.tsx @@ -64,23 +64,35 @@ export const DepsTable = ({ key: 'package', type: 'group', label: '原生包', - children: packages - .filter((p) => !!p.deps) - .map((p) => ({ - key: `p_${p.id}`, - label: p.name, - })), + children: packages.reduce( + (acc, p) => { + if (p.deps) { + acc.push({ + key: `p_${p.id}`, + label: p.name, + }); + } + return acc; + }, + [] as { key: string; label: string }[], + ), }, { key: 'version', type: 'group', label: '热更包', - children: versions - .filter((v) => !!v.deps) - .map((v) => ({ - key: `v_${v.id}`, - label: v.name, - })), + children: versions.reduce( + (acc, v) => { + if (v.deps) { + acc.push({ + key: `v_${v.id}`, + label: v.name, + }); + } + return acc; + }, + [] as { key: string; label: string }[], + ), }, ], onClick: ({ key }) => {