From 1e8be4558b563174abe44e4d4ac187931a4747e5 Mon Sep 17 00:00:00 2001 From: Wilfred Hughes Date: Sat, 20 Jul 2024 23:36:15 -0700 Subject: [PATCH] Fix performance when splitting very long lines during display --- src/display/style.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/display/style.rs b/src/display/style.rs index d65ef2245..72200ab90 100644 --- a/src/display/style.rs +++ b/src/display/style.rs @@ -92,7 +92,11 @@ fn split_string_by_width(s: &str, max_width: usize, tab_width: usize) -> Vec<(&s let mut parts: Vec<(&str, usize)> = vec![]; let mut s = s; - while width_respecting_tabs(s, tab_width) > max_width { + // Optimisation: width_respecting_tabs() walks the whole string, + // which is slow when we have files with massive lines. `s.len()` + // is always lower than width_respecting_tabs(s), so check that + // first. + while s.len() > max_width || width_respecting_tabs(s, tab_width) > max_width { let offset = byte_offset_for_width(s, max_width, tab_width); let part = substring_by_byte(s, 0, offset);