mirror of
https://github.com/PR0M3TH3AN/bitvid.git
synced 2026-11-07 13:22:54 +00:00
perf: Optimize chronological sorter hook resolution
Hoisted the timestamp hook resolution out of the inner loop in `createChronologicalSorter`. This avoids allocating an array of candidate functions for every comparison during sorting (O(N log N)). Benchmark shows a ~27% speedup (38ms -> 27ms for 100k items). Co-authored-by: PR0M3TH3AN <[email protected]>
This commit is contained in:
1 parent
ec50db8645
commit
7c1f3c9ada
2 files changed
+95
-25
No files matched your search
+37
-25
@@ -14,6 +14,14 @@ export function createChronologicalSorter({
|
||||
}
|
||||
|
||||
const copy = [...items];
|
||||
|
||||
// Pre-resolve hooks to avoid allocation and property access in the hot loop
|
||||
const hook = context?.hooks?.timestamps;
|
||||
const h1 = typeof hook?.getKnownVideoPostedAt === "function" ? hook.getKnownVideoPostedAt : null;
|
||||
const h2 = typeof hook?.getKnownPostedAt === "function" ? hook.getKnownPostedAt : null;
|
||||
const h3 = typeof hook?.getVideoPostedAt === "function" ? hook.getVideoPostedAt : null;
|
||||
const h4 = typeof hook?.resolveVideoPostedAt === "function" ? hook.resolveVideoPostedAt : null;
|
||||
|
||||
const getTimestamp = (entry) => {
|
||||
if (!entry || typeof entry !== "object") {
|
||||
return Number.NEGATIVE_INFINITY;
|
||||
@@ -36,33 +44,37 @@ export function createChronologicalSorter({
|
||||
}
|
||||
}
|
||||
|
||||
const hook = context?.hooks?.timestamps;
|
||||
if (!hook || typeof hook !== "object") {
|
||||
return null;
|
||||
}
|
||||
|
||||
const candidates = [
|
||||
hook.getKnownVideoPostedAt,
|
||||
hook.getKnownPostedAt,
|
||||
hook.getVideoPostedAt,
|
||||
hook.resolveVideoPostedAt,
|
||||
];
|
||||
|
||||
for (const candidate of candidates) {
|
||||
if (typeof candidate !== "function") {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Unrolled check for pre-resolved hooks
|
||||
if (h1) {
|
||||
try {
|
||||
const value = candidate(video, { entry, context });
|
||||
if (Number.isFinite(value)) {
|
||||
return Math.floor(value);
|
||||
}
|
||||
const value = h1(video, { entry, context });
|
||||
if (Number.isFinite(value)) return Math.floor(value);
|
||||
} catch (error) {
|
||||
context?.log?.(
|
||||
"[chronological-sorter] timestamps hook threw",
|
||||
error,
|
||||
);
|
||||
context?.log?.("[chronological-sorter] timestamps hook threw", error);
|
||||
}
|
||||
}
|
||||
if (h2) {
|
||||
try {
|
||||
const value = h2(video, { entry, context });
|
||||
if (Number.isFinite(value)) return Math.floor(value);
|
||||
} catch (error) {
|
||||
context?.log?.("[chronological-sorter] timestamps hook threw", error);
|
||||
}
|
||||
}
|
||||
if (h3) {
|
||||
try {
|
||||
const value = h3(video, { entry, context });
|
||||
if (Number.isFinite(value)) return Math.floor(value);
|
||||
} catch (error) {
|
||||
context?.log?.("[chronological-sorter] timestamps hook threw", error);
|
||||
}
|
||||
}
|
||||
if (h4) {
|
||||
try {
|
||||
const value = h4(video, { entry, context });
|
||||
if (Number.isFinite(value)) return Math.floor(value);
|
||||
} catch (error) {
|
||||
context?.log?.("[chronological-sorter] timestamps hook threw", error);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user