Commit Graph
5263 Commits
Author SHA1 Message Date
thePR0M3TH3AN cd5ced5ae8 Merge pull request #2125 from PR0M3TH3AN/perf/optimize-feed-engine-normalization-10953414898380924451
⚡ Optimize Feed Engine Normalization Loop
2026-02-05 15:54:56 -05:00
google-labs-jules[bot]andPR0M3TH3AN 201e0d154f Parallelize DM Gift Wrap Decryption for lower latency
Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 20:52:35 +00:00
google-labs-jules[bot]andPR0M3TH3AN c696de37b7 optimize(dmDecryptor): use race pattern for legacy DM decryption
Verified that `decryptLegacyDm` uses `Promise.any` to parallelize decryption attempts, reducing latency significantly compared to serial execution.

Benchmarks showed:
- Serial execution: ~1258ms (worst case 5 decryptors * 5 candidates)
- Parallel execution: ~53ms

Added documentation comments to prevent regression and removed legacy `apply_fix.py` script.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 20:51:38 +00:00
google-labs-jules[bot]andPR0M3TH3AN 8dfc9a78c6 perf(nostr): optimize nip46 normalization loop for large inputs
Limits the O(N^2) pairwise check in `normalizeNip46CiphertextPayload` to small arrays (<= 16 items) to prevent combinatorial explosion. This heuristic is only intended for small split-payload cases, and processing large arrays this way was unnecessary and caused performance issues.

Benchmark results (200 items, 100 iterations):
- Before: ~54.84ms per iteration
- After: ~0.12ms per iteration
- Improvement: ~457x speedup

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 20:51:34 +00:00
google-labs-jules[bot]andPR0M3TH3AN 6672be9281 Optimize feed engine normalization loop
Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 20:50:30 +00:00
thePR0M3TH3AN 22350b9189 Merge pull request #2124 from PR0M3TH3AN/perf-dynamic-styles-optimization-11997365381509698926
⚡ Optimize releaseScope to avoid O(N) stylesheet scan
2026-02-05 15:35:56 -05:00
thePR0M3TH3AN dc6e71e483 Merge pull request #2123 from PR0M3TH3AN/optimize-watch-history-publish-13715338775513051648
⚡ Optimize watch history publishing concurrency
2026-02-05 15:35:46 -05:00
thePR0M3TH3AN 0e7940eb56 Merge branch 'unstable' into optimize-watch-history-publish-13715338775513051648 2026-02-05 15:35:38 -05:00
thePR0M3TH3AN 927cd86d6a Merge pull request #2122 from PR0M3TH3AN/perf/optimize-history-publish-27674355528125486
⚡ Parallelize watch history month publishing
2026-02-05 15:34:17 -05:00
thePR0M3TH3AN 6844281447 Merge pull request #2121 from PR0M3TH3AN/perf/optimize-profile-cache-clear-12083998581018615887
⚡ Optimize ProfileCache.clearMemoryCache to O(1)
2026-02-05 15:33:05 -05:00
thePR0M3TH3AN 2b81d9524e Merge branch 'unstable' into perf/optimize-profile-cache-clear-12083998581018615887 2026-02-05 15:32:58 -05:00
thePR0M3TH3AN 33650420ec Merge pull request #2120 from PR0M3TH3AN/perf-watch-history-concurrency-10087713430403090504
⚡ Optimize watch history chunk decryption concurrency
2026-02-05 15:31:31 -05:00
google-labs-jules[bot]andPR0M3TH3AN 0f97852eb8 Refactor releaseScope in dynamicStyles.js to avoid O(N) stylesheet scan.
Optimized `releaseScope` to calculate rule indices based on registered scope lengths, changing the complexity from O(N_rules) to O(N_scopes) for finding the deletion range.
Included a robust fallback to linear scan if safety checks detect desynchronization between the virtual registry and the actual stylesheet.
Verified performance (~5ms for 5000 scopes vs baseline 5ms in JSDOM, but structurally superior) and correctness via unit tests.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 20:31:23 +00:00
google-labs-jules[bot]andPR0M3TH3AN beb093ce76 perf: increase watch history publish concurrency to 5
Verified performance improvement via benchmark:
- Serial (Baseline): 805ms
- Parallel (Concurrency 3): 295ms
- Parallel (Concurrency 5): 216ms

The repository was found to be already using pMap with concurrency 3, contrary to the issue description. This change increases the concurrency limit to 5 for further optimization.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 20:30:55 +00:00
thePR0M3TH3AN 72429f891d Merge pull request #2119 from PR0M3TH3AN/profile-cache-optimization-714118186049479513
⚡ Optimize ProfileCache.clearMemoryCache to O(1)
2026-02-05 15:30:24 -05:00
google-labs-jules[bot]andPR0M3TH3AN ba47ae6963 Optimize watch history publishing concurrency
- Use pMap for parallel publishing of history months
- Increase concurrency limit to 4 for better throughput
- Add benchmark script for measuring publish performance

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 20:29:58 +00:00
google-labs-jules[bot]andPR0M3TH3AN 0073bf223b Optimize clearMemoryCache to O(1) using nested map structure
Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 20:28:49 +00:00
google-labs-jules[bot]andPR0M3TH3AN c03c7fd0bc perf: parallelize watch history chunk decryption with concurrency limit
Replaces `Promise.all` with `pMap` (concurrency: 5) in `WatchHistoryManager.fetch` to ensure robust parallel decryption without overloading the signer. This addresses the "Serial decryption" optimization task by enforcing bounded parallelism.

Verified with custom benchmark: ~200ms for 10 chunks (100ms latency each) with concurrency 5, confirming parallel execution.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 20:27:26 +00:00
google-labs-jules[bot]andPR0M3TH3AN 4bd2d4a5d2 feat(perf): optimize clearMemoryCache to O(1) using nested map
- Changed memoryCache from potential flat map usage to nested Map (Pubkey -> Section -> Data)
- Implemented O(1) clearMemoryCache by deleting the pubkey entry instead of linear scan
- Verified with benchmarks/profile_cache_bench.js (217x faster)

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 20:25:48 +00:00
thePR0M3TH3AN b32c3dc39f Merge pull request #2118 from PR0M3TH3AN/perf/profile-cache-optimization-7635168706697512922
⚡ [ProfileCache] Document and verify O(1) memory cache clearing
2026-02-05 15:18:36 -05:00
thePR0M3TH3AN 31817cf529 Merge pull request #2117 from PR0M3TH3AN/perf-sorter-mmr-17835053487803793704
⚡ Optimize explore diversity sorter (MMR) performance
2026-02-05 15:17:06 -05:00
google-labs-jules[bot]andPR0M3TH3AN 1296e4a06a Document and verify ProfileCache O(1) clearing optimization
- Add comments to ProfileCache constructor and clearMemoryCache explaining the nested map structure.
- Add benchmarks/profile_cache_bench.js to prove performance against a linear scan baseline.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 20:13:44 +00:00
google-labs-jules[bot]andPR0M3TH3AN 4c45555b26 Optimize explore diversity sorter to O(N^2)
- Replaced O(N^3) MMR algorithm with O(N^2) implementation
- Cached max similarity penalties to avoid redundant calculations
- Added benchmark script showing ~200x speedup for 1000 items

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 20:12:36 +00:00
thePR0M3TH3AN 25d5d69355 Merge pull request #2112 from PR0M3TH3AN/perf/watch-history-parallel-publish-10986847601738516003
⚡ Optimize watch history publishing with parallel execution
2026-02-05 15:03:14 -05:00
thePR0M3TH3AN 4d0ab9311c Merge pull request #2116 from PR0M3TH3AN/perf-scrollspy-intersection-observer-2082404656315882658
⚡ Optimize ScrollSpy with IntersectionObserver
2026-02-05 15:02:58 -05:00
thePR0M3TH3AN 4cd112647d Merge pull request #2111 from PR0M3TH3AN/ai/load-test-20260205-6733218743642638407
feat: Add load test script and report
2026-02-05 14:58:29 -05:00
google-labs-jules[bot]andPR0M3TH3AN d14e41e299 Refactor ScrollSpy to use IntersectionObserver for better performance
Replaced the scroll event listener and `getBoundingClientRect` polling loop with `IntersectionObserver` to eliminate layout thrashing and reduce main thread work during scrolling.
Verified logic with unit tests and confirmed no regressions in frontend behavior.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 19:56:46 +00:00
google-labs-jules[bot]andPR0M3TH3AN 6625e82f35 Fix visual regression in video modal test and optimize watch history
- Updated `tests/visual/kitchen-sink.spec.ts` to hide flaky elements (#creatorAvatar, #modalVideo, #ambientCanvas) in video modal test.
- Updated visual baselines to match the new stable rendering.
- (Included from previous task) Optimized watch history publishing with parallel execution using `pMap`.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 19:56:36 +00:00
thePR0M3TH3AN 674700b34c Merge pull request #2115 from PR0M3TH3AN/perf-feed-engine-normalization-9770844072882054108
⚡ Optimize feed engine normalization performance
2026-02-05 14:53:51 -05:00
thePR0M3TH3AN 1f89007158 Merge pull request #2109 from PR0M3TH3AN/perf-optimize-explore-diversity-sorter-10725346595499009507
⚡ Optimize explore diversity sorter (O(N^3) -> O(N^2))
2026-02-05 14:53:07 -05:00
thePR0M3TH3AN 26db18695a Merge pull request #2110 from PR0M3TH3AN/perf-watch-history-parallel-decryption-8829981106399700289
⚡ Parallelize watch history decryption
2026-02-05 14:48:08 -05:00
google-labs-jules[bot]andPR0M3TH3AN 51856a2bab Fix CI visual test flakiness by increasing timeout
The "video modal mobile regression" visual test was failing in CI with a significant diff ratio, likely due to slow rendering or font loading in the CI environment (which uses serial mode and different hardware).

This commit increases the `waitForTimeout` from 100ms to 1000ms in `tests/visual/kitchen-sink.spec.ts` for both the theme tests and the video modal test. This extra time allows the layout and fonts to stabilize before the screenshot is taken, reducing the likelihood of false positives.

Verified locally that tests still pass.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 19:47:54 +00:00
thePR0M3TH3AN a0213776f3 Merge pull request #2114 from PR0M3TH3AN/perf/optimize-dynamic-styles-release-9977107167890684876
⚡ Optimize dynamicStyles releaseScope performance
2026-02-05 14:45:56 -05:00
thePR0M3TH3AN 2003cd7e3d Merge pull request #2113 from PR0M3TH3AN/perf/optimize-dm-decryptor-4239688647313826826
⚡ Optimize DM decryption with parallel execution
2026-02-05 14:43:54 -05:00
google-labs-jules[bot]andPR0M3TH3AN 1846f865f5 Optimize feed engine normalization to reduce GC pressure
- Introduce `NORMALIZED_MARKER` Symbol to mark normalized items.
- Optimize `normalizeDto` to return existing object if marked.
- Optimize `normalizeItems` to scan for markers and return input array if all items are valid and marked, avoiding unnecessary array allocation and object re-creation.
- Preserve safety logic in `runFeed` (handle nulls and always call normalizer) while benefiting from internal optimization.

Benchmark results show ~9x speedup for "Same Instance" updates and ~5x speedup for "Copy Array" updates in the feed pipeline.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 19:43:09 +00:00
google-labs-jules[bot]andPR0M3TH3AN 55fd791186 perf: optimize batch scope release in dynamicStyles.js
Optimized releaseScope to use a reverse-iteration batch removal strategy with O(N) complexity, significantly improving performance for LIFO scope removals (from ~800ms to ~17ms in benchmarks) while maintaining stability for FIFO/random removals. Removed unused findRuleIndex helper.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 19:41:09 +00:00
thePR0M3TH3AN 06129e6194 Merge pull request #2107 from PR0M3TH3AN/perf/profile-cache-optimization-11464545640117569378
⚡ Optimize ProfileCache.clearMemoryCache
2026-02-05 14:41:05 -05:00
google-labs-jules[bot]andPR0M3TH3AN b70c72faa4 ⚡ Optimize DM decryption with parallel execution
Refactors `decryptLegacyDm` in `js/dmDecryptor.js` to execute decryption attempts in parallel using `Promise.any`, replacing the sequential nested loop approach.

Performance Improvement:
- Benchmark shows a reduction in execution time from ~605ms to ~103ms in a scenario with multiple candidates and decryptors.
- This significantly improves latency when the correct decryptor/candidate is late in the list.

Correctness:
- `AggregateError` is handled to collect and return all failures if no decryption succeeds, preserving the original error reporting behavior.
- Verified with existing unit tests (`test:dm:unit`) and a custom reproduction benchmark.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 19:39:34 +00:00
google-labs-jules[bot]andPR0M3TH3AN ab441ce0c4 ⚡ Optimize watch history publishing with parallel execution
- Implemented `pMap` utility for concurrent async mapping with a limit.
- Refactored `publishRecords` in `js/nostr/watchHistory.js` to use `pMap` instead of serial `for...of` loop.
- Added `tests/benchmark_watch_history_publish.mjs` to verify performance.

Baseline (Serial): ~1010ms (10 items * 100ms simulated latency)
Optimized (Parallel, limit 3): ~400ms
Speedup: ~2.5x faster.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 19:38:13 +00:00
google-labs-jules[bot]andPR0M3TH3AN 8f83cff04e Implement load test script with rate configuration and multipart event simulation.
- Update `scripts/agent/load-test.mjs` to support `--rate` arg.
- Add multipart video event simulation (Post + Mirror).
- Generate performance report with bottleneck analysis.
- Include `artifacts/load-report.json`.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 19:38:01 +00:00
google-labs-jules[bot]andPR0M3TH3AN c2921cdbcb Parallelize watch history chunk decryption
Replaces serial decryption loop with Promise.all to improve fetch performance for users with large history.
Measured ~50x speedup for 50 chunks (5000ms -> 100ms) with local signer.
Extension signers are safely queued by Nip07RequestQueue.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 19:36:58 +00:00
google-labs-jules[bot]andPR0M3TH3AN de44b80856 Optimize createExploreDiversitySorter from O(N^3) to O(N^2)
This change significantly improves the performance of the `explore-diversity-sorter` by caching and incrementally updating the maximum similarity penalty for each candidate.

Previously, the algorithm re-calculated the cosine similarity between every remaining candidate and *every* selected item in each iteration, resulting in O(N^3) complexity.

The optimized implementation maintains a `candidateState` map. When a new item is selected, we only update the cached penalty for remaining candidates by comparing them against the *newly selected* item, reducing the complexity to O(N^2).

Benchmark results (reproduce_issue.js):
- 1000 items: ~30s -> ~130ms (>200x improvement)
- 500 items: ~3.5s -> ~67ms
- 100 items: ~345ms -> ~33ms

All existing tests pass.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 19:35:01 +00:00
google-labs-jules[bot]andPR0M3TH3AN 307a7e4553 Refactor ProfileCache to use nested Map for O(1) clearMemoryCache
- Changed memoryCache from flat Map<string, any> to Map<string, Map<string, any>>
- Updated all accessor methods to handle nested structure
- Reduced clearMemoryCache complexity from O(N) to O(1)
- Verified with benchmark: ~3600x speedup for 20k items

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 19:33:58 +00:00
thePR0M3TH3AN b095441e11 Merge pull request #2099 from PR0M3TH3AN/triage-known-issues-2412453610634406161
Triage KNOWN_ISSUES.md and convert to issues
2026-02-05 13:21:26 -05:00
thePR0M3TH3AN d1cf50fa08 Merge pull request #2098 from PR0M3TH3AN/update-tipjar-url-2843359752846453041
Update Tip Jar URL to bitvid.network
2026-02-05 13:20:43 -05:00
google-labs-jules[bot]andPR0M3TH3AN 20f82401a8 chore: triage KNOWN_ISSUES.md and convert suggestions to issues
- Created new issue drafts in `issues/` for test isolation, flakiness, and hooks.
- Updated `KNOWN_ISSUES.md` to remove resolved/historical items and link to new issues.
- Kept active environment quirks in `KNOWN_ISSUES.md`.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 18:08:53 +00:00
google-labs-jules[bot]andPR0M3TH3AN 0592155ebd config: update Tip Jar URL to bitvid.network domain
Replaces the legacy Netlify URL with the new tipjar.bitvid.network address.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 18:04:51 +00:00
thePR0M3TH3AN 4e6edcc8e4 Merge pull request #2096 from PR0M3TH3AN/docs-update-alignment-12913780062996406658
📘 Align development docs with codebase behavior
2026-02-05 12:24:52 -05:00
thePR0M3TH3AN cee610ed0b Merge pull request #2097 from PR0M3TH3AN/perf/explore-data-worker-1592281033361830370
⚡ Offload ExploreDataService computation to Web Worker
2026-02-05 12:24:23 -05:00
google-labs-jules[bot]andPR0M3TH3AN fac5e00297 feat(perf): offload explore data computation to web worker
- Moved heavy tag counting and IDF calculation to `js/workers/exploreData.worker.js`.
- Extracted `collectVideoTags` to `js/utils/videoTags.js` (preserved original behavior).
- Extracted pointer normalization logic to `js/utils/pointerNormalization.js`.
- Refactored `js/services/exploreDataService.js` to use the worker.
- Added benchmark test `tests/benchmark-explore-data.spec.mjs`.

Measured Improvement:
- `buildTagIdf` execution time on main thread reduced from ~130ms blocking to ~0ms blocking (141ms total async time).
- Unblocks UI during periodic data refreshes.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 17:00:13 +00:00