Skip to content

Commit e0e7ffa

Browse files
committed
perf: reduce memory usage
1 parent c995002 commit e0e7ffa

File tree

1 file changed

+25
-20
lines changed

1 file changed

+25
-20
lines changed

src/core.rs

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use itertools::Itertools;
2-
use std::cmp;
32
use std::io::{self, BufRead, Write};
43
use std::ops::Range;
54

@@ -11,31 +10,37 @@ pub fn write(
1110
vscale: f64,
1211
padding: Option<usize>,
1312
) -> io::Result<()> {
14-
let mut frame = vec![0..0; 4];
15-
for chunk in &reader
13+
let mut frame = [0..0, 0..0, 0..0, 0..0];
14+
reader
1615
.lines()
16+
.map(|line| {
17+
line.map(|line| {
18+
let beg = line.find(|c: char| !c.is_whitespace()).unwrap_or(usize::max_value());
19+
let end = line.rfind(|c: char| !c.is_whitespace()).unwrap_or(0);
20+
(beg, end)
21+
})
22+
})
1723
.enumerate()
1824
.map(|(i, line)| (scale(i, vscale), line))
1925
.group_by(|(i, _)| *i)
2026
.into_iter()
2127
.chunks(4)
22-
{
23-
let mut chunk_size = 0;
24-
for (i, (_, group)) in chunk.enumerate() {
25-
let (mut beg, mut end) = (usize::max_value(), 0);
26-
for (_, line) in group {
27-
let line: String = line?;
28-
beg = cmp::min(beg, line.find(|c: char| !c.is_whitespace()).unwrap_or(beg));
29-
end = cmp::max(end, line.rfind(|c: char| !c.is_whitespace()).unwrap_or(end));
28+
.into_iter()
29+
.try_for_each(|chunk| {
30+
let mut chunk_size = 0;
31+
for (i, (_, group)) in chunk.enumerate() {
32+
let (beg, end) = group
33+
.into_iter()
34+
.try_fold((usize::max_value(), 0), |(beg, end), (_, line)| {
35+
line.map(|(b, e)| (beg.min(b), end.max(e)))
36+
})?;
37+
frame[i] = beg..(end + 1);
38+
chunk_size += 1;
3039
}
31-
frame[i] = beg..(end + 1);
32-
chunk_size += 1;
33-
}
34-
frame.iter_mut().skip(chunk_size).for_each(|row| *row = 0..0);
35-
scale_frame(&mut frame, hscale);
36-
write_frame(&mut writer, &frame, padding)?;
37-
}
38-
Ok(())
40+
frame.iter_mut().skip(chunk_size).for_each(|row| *row = 0..0);
41+
scale_frame(&mut frame, hscale);
42+
write_frame(&mut writer, &frame, padding)
43+
})
3944
}
4045

4146
/// Print minimap to the stdout.
@@ -94,7 +99,7 @@ fn write_frame(mut output: impl Write, frame: &[Range<usize>], padding: Option<u
9499
}
95100

96101
fn scale_frame(frame: &mut [Range<usize>], factor: f64) {
97-
for x in frame.iter_mut() {
102+
for x in frame {
98103
*x = scale(x.start, factor)..scale(x.end, factor);
99104
}
100105
}

0 commit comments

Comments
 (0)