From b2f60a1f436567bca7bb4c8edd04096c573c4caa Mon Sep 17 00:00:00 2001 From: Niclas Date: Sat, 2 Jul 2022 22:00:49 +0000 Subject: [PATCH] Remove some unnecessary allocations (#480) --- crates/eww/src/config/system_stats.rs | 18 ++++---- crates/simplexpr/src/parser/lexer.rs | 66 +++++++++++++-------------- crates/yuck/src/parser/lexer.rs | 20 ++++---- 3 files changed, 53 insertions(+), 51 deletions(-) diff --git a/crates/eww/src/config/system_stats.rs b/crates/eww/src/config/system_stats.rs index 5d39ffc..20b6011 100644 --- a/crates/eww/src/config/system_stats.rs +++ b/crates/eww/src/config/system_stats.rs @@ -119,8 +119,8 @@ pub fn get_battery_capacity() -> Result { json.push_str(&format!( r#"{:?}: {{ "status": "{}", "capacity": {} }},"#, i.file_name().context("couldn't convert file name to rust string")?, - s.replace("\n", ""), - o.replace("\n", "") + s.trim_end_matches(|c| c == '\n'), + o.trim_end_matches(|c| c == '\n') )); if let (Ok(t), Ok(c), Ok(v)) = ( read_to_string(i.join("charge_full")), @@ -128,13 +128,15 @@ pub fn get_battery_capacity() -> Result { read_to_string(i.join("voltage_now")), ) { // (uAh / 1000000) * U = p and that / one million so that we have microwatt - current += - ((c.replace("\n", "").parse::()? / 1000000_f64) * v.replace("\n", "").parse::()?) / 1000000_f64; - total += - ((t.replace("\n", "").parse::()? / 1000000_f64) * v.replace("\n", "").parse::()?) / 1000000_f64; + current += ((c.trim_end_matches(|c| c == '\n').parse::()? / 1000000_f64) + * v.trim_end_matches(|c| c == '\n').parse::()?) + / 1000000_f64; + total += ((t.trim_end_matches(|c| c == '\n').parse::()? / 1000000_f64) + * v.trim_end_matches(|c| c == '\n').parse::()?) + / 1000000_f64; } else if let (Ok(t), Ok(c)) = (read_to_string(i.join("energy_full")), read_to_string(i.join("energy_now"))) { - current += c.replace("\n", "").parse::()?; - total += t.replace("\n", "").parse::()?; + current += c.trim_end_matches(|c| c == '\n').parse::()?; + total += t.trim_end_matches(|c| c == '\n').parse::()?; } else { log::warn!( "Failed to get/calculate uWh: the total_avg value of the battery magic var will probably be a garbage \ diff --git a/crates/simplexpr/src/parser/lexer.rs b/crates/simplexpr/src/parser/lexer.rs index 1741288..937c806 100644 --- a/crates/simplexpr/src/parser/lexer.rs +++ b/crates/simplexpr/src/parser/lexer.rs @@ -2,7 +2,7 @@ use std::str::pattern::Pattern; use eww_shared_util::{Span, Spanned}; use once_cell::sync::Lazy; -use regex::{escape, Regex, RegexSet}; +use regex::{Regex, RegexSet}; pub type Sp = (usize, T, usize); @@ -56,12 +56,12 @@ pub enum Token { } macro_rules! regex_rules { - ($( $regex:expr => $token:expr),*) => { + ($( $regex:literal => $token:expr),*) => { static LEXER_REGEX_SET: Lazy = Lazy::new(|| { RegexSet::new(&[ - $(format!("^{}", $regex)),* + $(concat!("^", $regex)),* ]).unwrap()}); static LEXER_REGEXES: Lazy> = Lazy::new(|| { vec![ - $(Regex::new(&format!("^{}", $regex)).unwrap()),* + $(Regex::new(concat!("^", $regex)).unwrap()),* ]}); static LEXER_FNS: Lazy Token + Sync + Send>>> = Lazy::new(|| { vec![ $(Box::new($token)),* @@ -74,37 +74,37 @@ pub static STR_INTERPOLATION_START: &str = "${"; pub static STR_INTERPOLATION_END: &str = "}"; regex_rules! { - escape(r"+") => |_| Token::Plus, - escape(r"-") => |_| Token::Minus, - escape(r"*") => |_| Token::Times, - escape(r"/") => |_| Token::Div, - escape(r"%") => |_| Token::Mod, - escape(r"==") => |_| Token::Equals, - escape(r"!=") => |_| Token::NotEquals, - escape(r"&&") => |_| Token::And, - escape(r"||") => |_| Token::Or, - escape(r">=") => |_| Token::GE, - escape(r"<=") => |_| Token::LE, - escape(r">") => |_| Token::GT, - escape(r"<") => |_| Token::LT, - escape(r"?:") => |_| Token::Elvis, - escape(r"=~") => |_| Token::RegexMatch, + r"\+" => |_| Token::Plus, + r"-" => |_| Token::Minus, + r"\*" => |_| Token::Times, + r"/" => |_| Token::Div, + r"%" => |_| Token::Mod, + r"==" => |_| Token::Equals, + r"!=" => |_| Token::NotEquals, + r"&&" => |_| Token::And, + r"\|\|" => |_| Token::Or, + r">=" => |_| Token::GE, + r"<=" => |_| Token::LE, + r">" => |_| Token::GT, + r"<" => |_| Token::LT, + r"\?:" => |_| Token::Elvis, + r"=~" => |_| Token::RegexMatch, - escape(r"!" ) => |_| Token::Not, - escape(r"-" ) => |_| Token::Negative, + r"!" => |_| Token::Not, + r"-" => |_| Token::Negative, - escape(r",") => |_| Token::Comma, - escape(r"?") => |_| Token::Question, - escape(r":") => |_| Token::Colon, - escape(r"(") => |_| Token::LPren, - escape(r")") => |_| Token::RPren, - escape(r"[") => |_| Token::LBrack, - escape(r"]") => |_| Token::RBrack, - escape(r"{") => |_| Token::LCurl, - escape(r"}") => |_| Token::RCurl, - escape(r".") => |_| Token::Dot, - escape(r"true") => |_| Token::True, - escape(r"false") => |_| Token::False, + r"," => |_| Token::Comma, + r"\?" => |_| Token::Question, + r":" => |_| Token::Colon, + r"\(" => |_| Token::LPren, + r"\)" => |_| Token::RPren, + r"\[" => |_| Token::LBrack, + r"\]" => |_| Token::RBrack, + r"\{" => |_| Token::LCurl, + r"\}" => |_| Token::RCurl, + r"\." => |_| Token::Dot, + r"true" => |_| Token::True, + r"false" => |_| Token::False, r"\s+" => |_| Token::Skip, r";.*"=> |_| Token::Comment, diff --git a/crates/yuck/src/parser/lexer.rs b/crates/yuck/src/parser/lexer.rs index 336bae1..00428c0 100644 --- a/crates/yuck/src/parser/lexer.rs +++ b/crates/yuck/src/parser/lexer.rs @@ -1,5 +1,5 @@ use once_cell::sync::Lazy; -use regex::{escape, Regex, RegexSet}; +use regex::{Regex, RegexSet}; use simplexpr::parser::lexer::{STR_INTERPOLATION_END, STR_INTERPOLATION_START}; use super::parse_error; @@ -41,12 +41,12 @@ impl std::fmt::Display for Token { } macro_rules! regex_rules { - ($( $regex:expr => $token:expr),*) => { + ($( $regex:literal => $token:expr),*) => { static LEXER_REGEX_SET: Lazy = Lazy::new(|| { RegexSet::new(&[ - $(format!("^{}", $regex)),* + $(concat!("^", $regex)),* ]).unwrap()}); static LEXER_REGEXES: Lazy> = Lazy::new(|| { vec![ - $(Regex::new(&format!("^{}", $regex)).unwrap()),* + $(Regex::new(concat!("^", $regex)).unwrap()),* ]}); static LEXER_FNS: Lazy Token + Sync + Send>>> = Lazy::new(|| { vec![ $(Box::new($token)),* @@ -57,12 +57,12 @@ macro_rules! regex_rules { static ESCAPE_REPLACE_REGEX: Lazy = Lazy::new(|| Regex::new(r"\\(.)").unwrap()); regex_rules! { - escape("(") => |_| Token::LPren, - escape(")") => |_| Token::RPren, - escape("[") => |_| Token::LBrack, - escape("]") => |_| Token::RBrack, - escape("true") => |_| Token::True, - escape("false") => |_| Token::False, + r"\(" => |_| Token::LPren, + r"\)" => |_| Token::RPren, + r"\[" => |_| Token::LBrack, + r"\]" => |_| Token::RBrack, + r"true" => |_| Token::True, + r"false" => |_| Token::False, r#"[+-]?(?:[0-9]+[.])?[0-9]+"# => |x| Token::NumLit(x), r#":[^\s\)\]}]+"# => |x| Token::Keyword(x), r#"[a-zA-Z_!\?<>/\.\*-\+\-][^\s{}\(\)\[\](){}]*"# => |x| Token::Symbol(x),