From 254b8b67bbe0245a2f117c030d2c10a2dde2ed46 Mon Sep 17 00:00:00 2001 From: Andrew Gallant Date: Fri, 5 Apr 2019 20:40:39 -0400 Subject: globset: small perf improvements This tweaks the path handling functions slightly to make them a hair faster. In particular, `file_name` is called on every path that ripgrep visits, and it was possible to remove a few branches without changing behavior. --- globset/src/lib.rs | 3 +++ globset/src/pathutil.rs | 16 +++------------- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/globset/src/lib.rs b/globset/src/lib.rs index de5948da..6b3ca85c 100644 --- a/globset/src/lib.rs +++ b/globset/src/lib.rs @@ -292,6 +292,7 @@ pub struct GlobSet { impl GlobSet { /// Create an empty `GlobSet`. An empty set matches nothing. + #[inline] pub fn empty() -> GlobSet { GlobSet { len: 0, @@ -300,11 +301,13 @@ impl GlobSet { } /// Returns true if this set is empty, and therefore matches nothing. + #[inline] pub fn is_empty(&self) -> bool { self.len == 0 } /// Returns the number of globs in this set. + #[inline] pub fn len(&self) -> usize { self.len } diff --git a/globset/src/pathutil.rs b/globset/src/pathutil.rs index 62a68322..6c2fb1e9 100644 --- a/globset/src/pathutil.rs +++ b/globset/src/pathutil.rs @@ -9,12 +9,8 @@ use bstr::BStr; pub fn file_name<'a>(path: &Cow<'a, BStr>) -> Option> { if path.is_empty() { return None; - } else if path.len() == 1 && path[0] == b'.' { - return None; } else if path.last() == Some(b'.') { return None; - } else if path.len() >= 2 && &path[path.len() - 2..] == ".." { - return None; } let last_slash = path.rfind_byte(b'/').map(|i| i + 1).unwrap_or(0); Some(match *path { @@ -47,15 +43,9 @@ pub fn file_name_ext<'a>(name: &Cow<'a, BStr>) -> Option> { if name.is_empty() { return None; } - let last_dot_at = { - let result = name - .bytes().enumerate().rev() - .find(|&(_, b)| b == b'.') - .map(|(i, _)| i); - match result { - None => return None, - Some(i) => i, - } + let last_dot_at = match name.rfind_byte(b'.') { + None => return None, + Some(i) => i, }; Some(match *name { Cow::Borrowed(name) => Cow::Borrowed(&name[last_dot_at..]), -- cgit v1.2.3