Skip to content

Commit e5da9cd

Browse files
committed
fix: perf issues with v1.1.0
Bring performance back
1 parent b4a517a commit e5da9cd

File tree

3 files changed

+45
-35
lines changed

3 files changed

+45
-35
lines changed

src/config.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -145,21 +145,21 @@ impl Config {
145145
Some(true) == self.output_json || options.get_flag("output_json")
146146
}
147147

148-
pub fn get_modified_time_operator(&self, options: &ArgMatches) -> (Operater, i64) {
148+
pub fn get_modified_time_operator(&self, options: &ArgMatches) -> Option<(Operater, i64)> {
149149
get_filter_time_operator(
150150
options.get_one::<String>("mtime"),
151151
get_current_date_epoch_seconds(),
152152
)
153153
}
154154

155-
pub fn get_accessed_time_operator(&self, options: &ArgMatches) -> (Operater, i64) {
155+
pub fn get_accessed_time_operator(&self, options: &ArgMatches) -> Option<(Operater, i64)> {
156156
get_filter_time_operator(
157157
options.get_one::<String>("atime"),
158158
get_current_date_epoch_seconds(),
159159
)
160160
}
161161

162-
pub fn get_created_time_operator(&self, options: &ArgMatches) -> (Operater, i64) {
162+
pub fn get_created_time_operator(&self, options: &ArgMatches) -> Option<(Operater, i64)> {
163163
get_filter_time_operator(
164164
options.get_one::<String>("ctime"),
165165
get_current_date_epoch_seconds(),
@@ -182,7 +182,7 @@ fn get_current_date_epoch_seconds() -> i64 {
182182
fn get_filter_time_operator(
183183
option_value: Option<&String>,
184184
current_date_epoch_seconds: i64,
185-
) -> (Operater, i64) {
185+
) -> Option<(Operater, i64)> {
186186
match option_value {
187187
Some(val) => {
188188
let time = current_date_epoch_seconds
@@ -192,12 +192,12 @@ fn get_filter_time_operator(
192192
.abs()
193193
* DAY_SECONDS;
194194
match val.chars().next().expect("Value should not be empty") {
195-
'+' => (Operater::LessThan, time - DAY_SECONDS),
196-
'-' => (Operater::GreaterThan, time),
197-
_ => (Operater::Equal, time - DAY_SECONDS),
195+
'+' => Some((Operater::LessThan, time - DAY_SECONDS)),
196+
'-' => Some((Operater::GreaterThan, time)),
197+
_ => Some((Operater::Equal, time - DAY_SECONDS)),
198198
}
199199
}
200-
None => (Operater::GreaterThan, 0),
200+
None => None,
201201
}
202202
}
203203

src/dir_walker.rs

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@ pub struct WalkData<'a> {
3535
pub filter_regex: &'a [Regex],
3636
pub invert_filter_regex: &'a [Regex],
3737
pub allowed_filesystems: HashSet<u64>,
38-
pub filter_modified_time: (Operater, i64),
39-
pub filter_accessed_time: (Operater, i64),
40-
pub filter_changed_time: (Operater, i64),
38+
pub filter_modified_time: Option<(Operater, i64)>,
39+
pub filter_accessed_time: Option<(Operater, i64)>,
40+
pub filter_changed_time: Option<(Operater, i64)>,
4141
pub use_apparent_size: bool,
4242
pub by_filecount: bool,
4343
pub ignore_hidden: bool,
@@ -116,27 +116,33 @@ fn ignore_file(entry: &DirEntry, walk_data: &WalkData) -> bool {
116116
let is_dot_file = entry.file_name().to_str().unwrap_or("").starts_with('.');
117117
let is_ignored_path = walk_data.ignore_directories.contains(&entry.path());
118118

119-
let size_inode_device = get_metadata(entry.path(), false);
120-
if let Some((_size, Some((_id, dev)), (modified_time, accessed_time, changed_time))) =
121-
size_inode_device
122-
{
123-
if !walk_data.allowed_filesystems.is_empty()
124-
&& !walk_data.allowed_filesystems.contains(&dev)
125-
{
126-
return true;
119+
if !walk_data.allowed_filesystems.is_empty() {
120+
let size_inode_device = get_metadata(entry.path(), false);
121+
if let Some((_size, Some((_id, dev)), _gunk)) = size_inode_device {
122+
if !walk_data.allowed_filesystems.contains(&dev) {
123+
return true;
124+
}
127125
}
128-
if entry.path().is_file()
129-
&& [
130-
(&walk_data.filter_modified_time, modified_time),
131-
(&walk_data.filter_accessed_time, accessed_time),
132-
(&walk_data.filter_changed_time, changed_time),
133-
]
134-
.iter()
135-
.any(|(filter_time, actual_time)| {
136-
is_filtered_out_due_to_file_time(filter_time, *actual_time)
137-
})
138-
{
139-
return true;
126+
}
127+
if walk_data.filter_accessed_time.is_some()
128+
|| walk_data.filter_modified_time.is_some()
129+
|| walk_data.filter_changed_time.is_some()
130+
{
131+
let size_inode_device = get_metadata(entry.path(), false);
132+
if let Some((_, _, (modified_time, accessed_time, changed_time))) = size_inode_device {
133+
if entry.path().is_file()
134+
&& [
135+
(&walk_data.filter_modified_time, modified_time),
136+
(&walk_data.filter_accessed_time, accessed_time),
137+
(&walk_data.filter_changed_time, changed_time),
138+
]
139+
.iter()
140+
.any(|(filter_time, actual_time)| {
141+
is_filtered_out_due_to_file_time(filter_time, *actual_time)
142+
})
143+
{
144+
return true;
145+
}
140146
}
141147
}
142148

src/utils.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,13 +65,17 @@ pub fn is_filtered_out_due_to_regex(filter_regex: &[Regex], dir: &Path) -> bool
6565
}
6666
}
6767

68-
pub fn is_filtered_out_due_to_file_time(filter_time: &(Operater, i64), actual_time: i64) -> bool {
68+
pub fn is_filtered_out_due_to_file_time(
69+
filter_time: &Option<(Operater, i64)>,
70+
actual_time: i64,
71+
) -> bool {
6972
match filter_time {
70-
(Operater::Equal, bound_time) => {
73+
None => false,
74+
Some((Operater::Equal, bound_time)) => {
7175
!(actual_time >= *bound_time && actual_time < *bound_time + DAY_SECONDS)
7276
}
73-
(Operater::GreaterThan, bound_time) => actual_time < *bound_time,
74-
(Operater::LessThan, bound_time) => actual_time > *bound_time,
77+
Some((Operater::GreaterThan, bound_time)) => actual_time < *bound_time,
78+
Some((Operater::LessThan, bound_time)) => actual_time > *bound_time,
7579
}
7680
}
7781

0 commit comments

Comments
 (0)