Skip to content

Linux perf: ReadyToRun publish, faster MIME/icon lookup - #56

Merged
MemerGamer merged 8 commits into
linux/mainfrom
linux/perf1
Oct 5, 2026
Merged

MemerGamer merged 8 commits into
linux/mainfrom
linux/perf1

Conversation

@MemerGamer

@MemerGamer MemerGamer commented Oct 5, 2026 •

Copy link
Copy Markdown
Owner

Builds on #53. Based on linux/main (includes #55 crash fix and #52 incremental listing).

Measured (Release self-contained publish, headless Xvfb, software GL, nice 19)

before after
Cold start: window appears 1.7-2.0 s 1.2 s
Cold start: Home content / settled 3.5-3.9 s / 4.3-5.1 s 2.6 s / 3.3-3.5 s
Methods JIT-compiled in a 45 s session 46,342 17,516
Switch to Grid, 1000 files (first content) 5.3 s blank < 0.5 s
Switch to Grid, 10,000 files (UI-thread busy) 10.6 s 1.0 s
Scroll/PageDown/End in Grid, 10,000 files (UI-thread busy, ~15 s window) 10.9 s 1.5 s
Working set after Grid + scroll, 10,000 files 1.17-2.0 GB (grows with scrolling) ~0.78 GB, flat
GC pause total in a grid session 2.8 s 1.2 s
Watcher add/remove of 3 files in a 1000-file list: blank list 350-450 ms 0 ms

Changes

  • ReadyToRun for Linux Release publishes (it was silently not applied).
  • Grid/Cards virtualization on Uno (src/Files.App.UnoVirtualization): ItemsWrapGrid is a stub on Skia, so the layouts used a non-virtualizing WrapPanel that realized every item. New VirtualizingWrapGrid plugs a wrapping layout into Uno's VirtualizingPanelLayout. Uno.UI is publicized with Krafs.Publicizer in a separate project, because publicizing it in Files.App breaks the Uno XAML generator. Windows still uses ItemsWrapGrid (#if !WINDOWS). Selection, keyboard nav (including the Linux: integration sweep fixes (preview pane, omnibar, list keys, details) #53 Home/End/PageUp/PageDown handler), context menu and thumbnails-on-realize work as in Details (checked headless: arrows, PageDown/Up, End -> last item, right-click menu).
  • Svg.Skia typeface lookups are memoized: every SVG paint went through SKFontManager.GetFontStyles, whose style sets were disposed on the finalizer thread (about 16 s of finalizer samples in a session on a box with 12k fonts; now none).
  • MIME glob index, MIME XML and icon-name caches. Review fix: cached MIME XML and misses are re-checked (mtime / re-probe) every 5 s, so a newly installed MIME type appears without a restart (RecheckInterval, with a test).
  • Watcher changes now update the displayed list with individual Remove/Insert (when <= 64 changes, same order, no grouping) instead of Clear + Reset, which blanked the whole list.

Not done / next

  • Resize black area: Uno's X11 host already renders on the first ConfigureNotify; the delay is full relayout plus GL surface recreation. Setting the X window background to the theme colour needs a native handle and can't be verified without a compositor (KWin/XWayland), so it is left out.
  • Remaining blank on F5 / navigation (150-300 ms) is a full reload by design.
  • Grouped Grid view is not virtualized specially; unchanged from before apart from the new panel (group headers untested).

Tests: Files.Platform.Tests 758 passed, 7 skipped.

🤖 Generated with Claude Code

https://claude.ai/code/session_01LeKXJc3DnK3PzAqwgA72NY

Base automatically changed from linux/main to main October 5, 2026 17:37
@MemerGamer
MemerGamer changed the base branch from main to linux/main October 5, 2026 17:38
MemerGamer and others added 3 commits October 5, 2026 20:44
@MemerGamer
MemerGamer merged commit 9cbc1e8 into linux/main Oct 5, 2026
4 of 5 checks passed
@MemerGamer
MemerGamer deleted the linux/perf1 branch October 5, 2026 19:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant