diff --git a/README.md b/README.md index afc1a8d..892bd7d 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ Hyprland desktop setup on Fedora Linux, styled with Catppuccin Mocha. Built for │ │ ├── reload.sh # Reload compositor, bar, and notifications │ │ └── wallpaper.sh # Per-workspace wallpaper listener │ ├── kitty/ -│ │ └── kitty.conf # GPU terminal with 144Hz input tuning +│ │ └── kitty.conf # GPU terminal with configured redraw delays │ ├── rofi/ │ │ ├── config.rasi # Application launcher │ │ ├── scripts/ @@ -109,11 +109,11 @@ https://github.com/user-attachments/assets/e41b7de6-2717-4371-a81f-c4a124757f12 |---|---| | [Hyprland](https://github.com/hyprwm/Hyprland) | Wayland tiling compositor | | [Waybar](https://github.com/Alexays/Waybar) | Floating status bar with workspace indicators | -| [awww](https://codeberg.org/LGFae/awww) | Wallpaper daemon running 144 FPS bezier transitions | +| [awww](https://codeberg.org/LGFae/awww) | Wallpaper daemon with transitions configured at 144 FPS | | [SwayNC](https://github.com/ErikReider/SwayNotificationCenter) | Notification center and quick settings | | [hyprlock](https://github.com/hyprwm/hyprlock) | Screen locker with screenshot blur | | [hypridle](https://github.com/hyprwm/hypridle) | Idle listener and sleep controller | -| [Kitty](https://github.com/kovidgoyal/kitty) | Terminal emulator running 6ms refresh and 1ms input latency | +| [Kitty](https://github.com/kovidgoyal/kitty) | Terminal emulator with 6ms repaint and 1ms input delay settings | | [Rofi](https://github.com/davatorium/rofi) | App launcher, power menu, and picker scripts | | [Fastfetch](https://github.com/fastfetch-cli/fastfetch) | System information summary | @@ -160,7 +160,7 @@ To link all configuration directories (`hypr`, `waybar`, `kitty`, `rofi`, `swayn ./scripts/install-symlinks.sh ``` -Existing conflicting configuration files or directories will be safely backed up automatically with a timestamp before creating the symlinks. +Existing conflicting files, directories, and symlinks are preserved in unique backup directories before replacement. ## System optimizations @@ -206,3 +206,10 @@ deduplication. Git identity, credentials, signing, and differing local overrides stay local and take precedence. Symlinked `.bashrc` or `.gitconfig` require manual integration. Backups use unique `.backup-*` names; link conflicts are stored under `BACKUP/original`. Restore backups to undo installation, then open a new shell. + + +### Performance evidence + +See [the performance baseline](docs/performance-baseline.md) for recorded shell +startup samples, their sandbox limitations, and the remaining host checks. Current +visual and redraw settings are preferences; they do not establish measured latency. diff --git a/docs/performance-baseline.md b/docs/performance-baseline.md new file mode 100644 index 0000000..1e252a4 --- /dev/null +++ b/docs/performance-baseline.md @@ -0,0 +1,75 @@ +# Workstation performance baseline + +## TL;DR + +Preserve the current visuals and target balanced responsiveness. Configuration is +not a benchmark. The measurements below were captured in a restricted agent +sandbox, not a complete Hyprland session; no desktop performance gain is claimed. + +## Recorded evidence + +| Check | Observation | Limit | +|---|---|---| +| OS | Fedora 43 KDE edition | Read from host os-release | +| Memory/storage | About 30 GiB RAM, 8 GiB zram, Btrfs on NVMe | Snapshot, not a pressure test | +| Shell with current startup | 20 samples; median 39.32 ms; range 38.53–41.25 ms | Non-login interactive Bash, no PTY, output discarded | +| Shell without Fastfetch | 20 samples; median 33.95 ms; range 32.84–35.54 ms | Temporary rc file; original startup untouched | +| Fastfetch difference | 5.37 ms between medians | Sandbox observation only; retain current behavior | +| Codec package | mesa-va-drivers-freeworld installed; mesa-va-drivers absent | Package inventory does not prove application decoding | +| Power configuration | `/etc/tuned/active_profile`: balanced; EPP: balance_performance | Live TuneD activation could not be queried | +| Monitor/compositor | Unverified | Hyprland socket access denied | +| Boot/failed services | Unverified | System and user bus access denied | +| Desktop idle CPU/power | Unverified | Process visibility excludes the live desktop | + +## Repeat shell startup measurement + +Run from your normal host terminal. This measures startup without terminal +rendering, so also compare perceived opening time in Kitty. The temporary variant +intercepts the direct Fastfetch startup invocation; it never edits dotfiles. + +```python +import pathlib, statistics, subprocess, tempfile, time + +original = pathlib.Path.home().joinpath('.bashrc').read_text() +with tempfile.TemporaryDirectory() as directory: + for variant in ('current', 'without_fastfetch'): + rc = pathlib.Path(directory) / variant + # Intercept only direct fastfetch calls in this disposable child shell. + # The tracked fragment and existing rc both use direct calls. + rc.write_text(('fastfetch() { :; }\n' if variant == 'without_fastfetch' else '') + original) + samples = [] + for _ in range(20): + start = time.perf_counter() + subprocess.run(['bash', '--noprofile', '--rcfile', str(rc), '-ic', 'exit'], + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, check=True) + samples.append((time.perf_counter() - start) * 1000) + assert len(samples) == 20 + print(variant, 'median/range ms:', statistics.median(samples), min(samples), max(samples)) +``` + +This temporary function does not intercept an explicit `command fastfetch` or +absolute executable path; inspect customized startup files before using it. +Retain Fastfetch unless repeated host measurements or your preference justify +moving it to an on-demand command. + +## Complete the host baseline + +- Capture `systemd-analyze`, `systemd-analyze critical-chain`, and failed system/user + units across three comparable cold boots. Report medians and ranges, not a single + longest service: services can start in parallel. +- Run `hyprctl monitors`, `hyprctl configerrors`, `tuned-adm active`, and + `tuned-adm verify`. Confirm actual resolution/refresh and power-profile activation. +- Count `wallpaper.sh` listener processes after login and after ten `SUPER+A` + refreshes. There should be one listener. +- With the same apps open and no builds/downloads, capture three sixty-second + idle samples using `pidstat -u -r 1 60` if installed. Record compositor, bar, + wallpaper, CPU activity, and available hardware power readings separately. +- Inspect `vainfo` and the browser's media diagnostics during the same video test. + Confirm the codec, rendering/decoding device, CPU use, and dropped frames. + +## Change policy + +Keep blur, transparency, animations, VRR, Kitty delays, and wallpaper transition +rate unchanged in this series. Test one proposed tuning change at a time with the +same workload. Adopt it only if improvement is repeatable beyond baseline variation, +and record any visual, latency, or idle-power tradeoff plus rollback.