perf(terminal): make screen clone match Zig, batch OSC payload copies
screen-clone was 2.6x slower than Zig. The main cost was in PageList::clone_range: it created a throwaway page, recycled it into the pool and Page::reinit then memset the entire page again, faulting in every cell. Untouched pages now go to a clean_pool that create_node reuses without re-zeroing. Page::init allocates cells with bytemuck::allocation::try_zeroed_vec (Cell derives Zeroable), getting lazily-zeroed memory from the allocator without unsafe code, and clone_partial_row_from bulk-copies plain-cell runs in rows with managed memory. screen-clone clone: 78 ms -> ~28 ms (Zig ~27.8 ms). osc::Parser::next_slice appends payload bytes in bulk while behaving exactly like per-byte next() (2048 limit, overflow), verified by a property test; the osc-parser bench uses it (54.5 -> ~32 ms, Zig ~28). Still slower: screen-clone render (~2.4x), dominated by per-row style vectors in RenderState::update. Test Plan: - cargo test --workspace (no failures) - ghostty-bench +screen-clone / +osc-parser with --profile production
This commit is contained in:
1 parent
bd48c39d5f
commit
e423dd5586
7 files changed
+107
-17
No files matched your search
@@ -231,9 +231,7 @@ impl Benchmark for OscParser {
|
||||
Ok(_) => return Ok(()),
|
||||
Err(_) => return Err(BenchmarkFailed),
|
||||
}
|
||||
for &c in &osc_buf[..len] {
|
||||
self.parser.next(c);
|
||||
}
|
||||
self.parser.next_slice(&osc_buf[..len]);
|
||||
black_box(self.parser.end(Some(0x07)));
|
||||
self.parser.reset();
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user