From 17124c74271232448ed38b066d5b00c6471fb047 Mon Sep 17 00:00:00 2001 From: Dan Davison Date: Wed, 24 May 2023 20:07:34 -0400 Subject: Performance tweaks --- src/edits.rs | 21 +++++++++++++++++---- src/handlers/hunk.rs | 8 ++++++-- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/edits.rs b/src/edits.rs index b6e1ad9f..d571f2d2 100644 --- a/src/edits.rs +++ b/src/edits.rs @@ -43,15 +43,28 @@ where let mut annotated_plus_lines = Vec::>::new(); let mut line_alignment = Vec::<(Option, Option)>::new(); + let tokenized_minus_lines = minus_lines + .iter() + .map(|line| tokenize(line, tokenization_regex)); + + let tokenized_plus_lines: Vec> = plus_lines + .iter() + .map(|line| tokenize(line, tokenization_regex)) + .collect(); + let mut plus_index = 0; // plus lines emitted so far - 'minus_lines_loop: for (minus_index, minus_line) in minus_lines.iter().enumerate() { + 'minus_lines_loop: for ((minus_index, minus_line), tokenized_minus_line) in + minus_lines.iter().enumerate().zip(tokenized_minus_lines) + { let mut considered = 0; // plus lines considered so far as match for minus_line - for plus_line in &plus_lines[plus_index..] { + for (plus_offset, plus_line) in plus_lines[plus_index..].iter().enumerate() { + // Compute edit operations transforming minus line into plus line let alignment = align::Alignment::new( - tokenize(minus_line, tokenization_regex), - tokenize(plus_line, tokenization_regex), + tokenized_minus_line.clone(), + tokenized_plus_lines[plus_index + plus_offset].clone(), ); + // Use edit operations to annotate minus and plus line let (annotated_minus_line, annotated_plus_line, distance) = annotate( alignment, noop_deletions[minus_index], diff --git a/src/handlers/hunk.rs b/src/handlers/hunk.rs index b5c777c2..2b1d075a 100644 --- a/src/handlers/hunk.rs +++ b/src/handlers/hunk.rs @@ -75,8 +75,12 @@ impl<'a> StateMachine<'a> { { self.painter.paint_buffered_minus_and_plus_lines(); } - if let State::HunkHeader(_, parsed_hunk_header, line, raw_line) = &self.state.clone() { - self.emit_hunk_header_line(parsed_hunk_header, line, raw_line)?; + if let State::HunkHeader(_, parsed_hunk_header, line, raw_line) = &self.state { + self.emit_hunk_header_line( + &parsed_hunk_header.clone(), + &line.clone(), + &raw_line.clone(), + )?; } self.state = match new_line_state(&self.line, &self.raw_line, &self.state, self.config) { Some(HunkMinus(diff_type, raw_line)) => { -- cgit v1.2.3