From 2c7227a2787333fa3729127098a206a16907c233 Mon Sep 17 00:00:00 2001 From: Josh McKinney Date: Fri, 26 Apr 2024 19:54:58 -0700 Subject: [PATCH] perf(crossterm): Speed up combined fg and bg color changes by up to 20% Use Crossterm SetColors instead of SetForegroundColor and SetBackgroundColor. In https://github.com/crossterm-rs/crossterm/pull/879 I changed the SetColors command to write both colors at once with a single write instead of multiple writes that more bytes. This led to a 15-25% fps increase when testing the colors_rgb example on iTerm2 on an M2 Macbook Pro. --- src/backend/crossterm.rs | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/backend/crossterm.rs b/src/backend/crossterm.rs index d451e4384..46351b604 100644 --- a/src/backend/crossterm.rs +++ b/src/backend/crossterm.rs @@ -10,8 +10,8 @@ use crossterm::{ cursor::{Hide, MoveTo, Show}, execute, queue, style::{ - Attribute as CAttribute, Attributes as CAttributes, Color as CColor, ContentStyle, Print, - SetAttribute, SetBackgroundColor, SetForegroundColor, + Attribute as CAttribute, Attributes as CAttributes, Color as CColor, Colors, ContentStyle, + Print, SetAttribute, SetBackgroundColor, SetColors, SetForegroundColor, }, terminal::{self, Clear}, }; @@ -145,14 +145,11 @@ where diff.queue(&mut self.writer)?; modifier = cell.modifier; } - if cell.fg != fg { - let color = CColor::from(cell.fg); - queue!(self.writer, SetForegroundColor(color))?; + if cell.fg != fg || cell.bg != bg { + let fg_color = CColor::from(cell.fg); + let bg_color = CColor::from(cell.bg); + queue!(self.writer, SetColors(Colors::new(fg_color, bg_color)))?; fg = cell.fg; - } - if cell.bg != bg { - let color = CColor::from(cell.bg); - queue!(self.writer, SetBackgroundColor(color))?; bg = cell.bg; } #[cfg(feature = "underline-color")]