mirror of
https://github.com/PR0M3TH3AN/bitvid.git
synced 2026-10-27 07:52:24 +00:00
- Implements `toLightweightVideo` helper in `js/services/exploreDataService.js` to strip large fields (content, signatures, etc.) from video objects before sending to the worker. - Updates `buildWatchHistoryTagCounts` and `buildTagIdf` to use lightweight objects. - Adds `tests/services/exploreDataService.optimization.test.mjs` to verify correctness. - Adds `benchmarks/worker_transfer_lightweight_bench.js` demonstrating ~40% improvement in transfer time. Co-authored-by: PR0M3TH3AN <[email protected]>
101 lines
2.7 KiB
JavaScript
101 lines
2.7 KiB
JavaScript
|
|
import { Worker } from "worker_threads";
|
|
import { performance } from "perf_hooks";
|
|
|
|
const WORKER_CODE = `
|
|
const { parentPort } = require('worker_threads');
|
|
parentPort.on('message', (data) => {
|
|
parentPort.postMessage('pong');
|
|
});
|
|
`;
|
|
|
|
// Implementation of toLightweightVideo to verify performance
|
|
function toLightweightVideo(video) {
|
|
if (!video || typeof video !== "object") {
|
|
return null;
|
|
}
|
|
|
|
const lightweight = {
|
|
id: video.id,
|
|
kind: video.kind,
|
|
pubkey: video.pubkey,
|
|
nip71: video.nip71,
|
|
tags: [],
|
|
};
|
|
|
|
if (Array.isArray(video.tags)) {
|
|
for (const t of video.tags) {
|
|
if (Array.isArray(t) && t.length >= 2) {
|
|
const type = t[0];
|
|
if (type === "d" || type === "t") {
|
|
lightweight.tags.push(t);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return lightweight;
|
|
}
|
|
|
|
async function runBenchmark() {
|
|
const worker = new Worker(WORKER_CODE, { eval: true });
|
|
|
|
// Create a large list of full video objects
|
|
const listSize = 10000;
|
|
const fullVideos = [];
|
|
for (let i = 0; i < listSize; i++) {
|
|
fullVideos.push({
|
|
id: `key-${i}`,
|
|
content: "some content ".repeat(20), // ~200 chars
|
|
tags: [["t", "tag1"], ["t", "tag2"], ["p", "pubkey"], ["d", "identifier"], ["zap", "zapdata"]],
|
|
created_at: Date.now(),
|
|
pubkey: "some-pubkey",
|
|
sig: "some-sig",
|
|
kind: 30078,
|
|
nip71: { hashtags: ["tag3"], t: ["tag4"] },
|
|
relays: ["wss://relay1", "wss://relay2"],
|
|
otherBigField: "x".repeat(100),
|
|
});
|
|
}
|
|
|
|
console.log(`List size: ${listSize}`);
|
|
|
|
// Warmup
|
|
await new Promise((resolve) => {
|
|
worker.once('message', resolve);
|
|
worker.postMessage({ type: 'ping', payload: [] });
|
|
});
|
|
|
|
// Measure Full Transfer
|
|
let start = performance.now();
|
|
for (let i = 0; i < 10; i++) {
|
|
await new Promise((resolve) => {
|
|
worker.once('message', resolve);
|
|
worker.postMessage({ type: 'ping', payload: fullVideos });
|
|
});
|
|
}
|
|
let end = performance.now();
|
|
const fullTime = (end - start);
|
|
console.log(`Full Transfer (10 runs): ${fullTime.toFixed(2)}ms`);
|
|
|
|
// Measure Lightweight Transfer (using helper)
|
|
start = performance.now();
|
|
for (let i = 0; i < 10; i++) {
|
|
const lightweightVideos = fullVideos.map(toLightweightVideo);
|
|
await new Promise((resolve) => {
|
|
worker.once('message', resolve);
|
|
worker.postMessage({ type: 'ping', payload: lightweightVideos });
|
|
});
|
|
}
|
|
end = performance.now();
|
|
const lightTime = (end - start);
|
|
console.log(`Lightweight Transfer + Map Overhead (10 runs): ${lightTime.toFixed(2)}ms`);
|
|
|
|
const improvement = ((fullTime - lightTime) / fullTime) * 100;
|
|
console.log(`Improvement: ${improvement.toFixed(2)}%`);
|
|
|
|
worker.terminate();
|
|
}
|
|
|
|
runBenchmark().catch(console.error);
|