Skip to content

perf: optimize ledger render - lazy baseline + tail file reads - #7

Open
adiled wants to merge 3 commits into
mainfrom
ledger-frags
Open

perf: optimize ledger render - lazy baseline + tail file reads#7
adiled wants to merge 3 commits into
mainfrom
ledger-frags

Conversation

@adiled

@adiled adiled commented Aug 18, 2026

Copy link
Copy Markdown
Owner

Problem

Jab log LLM-heavy workloads chalatay hain to ledger.jsonl bohat bara ho jata hai.
CCFT ki TUI har ~1 second:

  1. Poor ledger parse karti hai app.agg.records mein
  2. Baseline (heavy computation: session grouping, percentiles, daily stats) har tick pe re-compute karti hai bhale hi ledger change na hua ho
  3. Ledger panel records.clone() + sort karta hai

Is se render stuttering hota hai.

Solution

1. Baseline caching — mtime + newest timestamp track karta hai, baseline sirf tab recompute hota hai jab ledger file actual me badle (nayi line aaye).

2. Ledger tail-readload_top_records(n) file ke last N lines ko backward-seek se padhta hai, bina poor file parse kiye. Ledger panel direct file se data leta hai, clone/remove sort.

New functions in ledger_read.rs

  • load_top_records(n) — top-N newest records without full file parse
  • read_last_n_lines(p, n) — safe backward-seek
  • ledger_files_mtime() — max mtime across ledger files
  • newest_record_ts() — newest record timestamp

New fields on App

  • last_baseline_mtime: u64
  • last_baseline_load_ts: Option<f64>

Regression risk

iter_records() unchanged — pure addition. Existing behavior untouched.

adiled added 3 commits August 19, 2026 00:04
Remove the two biggest performance bottlenecks:

1. Baseline caching — baseline was recomputed every ~1s tick on the
   entire ledger regardless of whether anything changed. Now it only
   re-computes when ledger_files_mtime() or newest_record_ts()
   changes, i.e. only when a new record is appended.

2. Ledger panel tail-read — ledger table no longer clones
   app.agg.records (which stores all filtered records). Instead it
   calls load_top_records() which uses safe backward-byte seeking to
   read only the last N lines from each ledger file, parsing only
   what is needed for display.

New functions in ledger_read.rs:
  - load_top_records(n)  — top-N newest records without full parse
  - read_last_n_lines(p, n) — safe backward-seek without line corruption
  - ledger_files_mtime()  — max mtime across all ledger files
  - newest_record_ts()     — timestamp of the most recent record

App struct gains:
  - last_baseline_mtime: u64
  - last_baseline_load_ts: Option<f64>

Zero regression on existing paths — iter_records unchanged.
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