Skip to content

Commit 6ae40a5

Browse files
author
Your Name
committed
Optimization
1 parent c1abfb4 commit 6ae40a5

File tree

11 files changed

+225
-136
lines changed

11 files changed

+225
-136
lines changed

.devcontainer/Dockerfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ FROM ubuntu:22.04 as rbase
22
RUN apt-get update && \
33
apt-get install -y \
44
git \
5+
git-lfs \
56
curl \
67
build-essential
78

.gitattributes

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
data/Image-arm64be filter=lfs diff=lfs merge=lfs -text
2+
data/Image-arm32le filter=lfs diff=lfs merge=lfs -text

.vscode/tasks.json

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,37 @@
1111
}
1212
},
1313
{
14-
"label": "Run",
14+
"label": "Build - Release",
1515
"type": "shell",
16-
"command": "cargo run -- ${workspaceFolder}/data/Image-arm32",
16+
"command": "cargo build --release",
17+
"group": "build",
18+
"options": {
19+
"cwd": "${workspaceFolder}"
20+
}
21+
},
22+
{
23+
"label": "Run 32 - Debug",
24+
"type": "shell",
25+
"command": "cargo run -- ${workspaceFolder}/data/Image-arm32le",
26+
"group": "build",
27+
"options": {
28+
"cwd": "${workspaceFolder}",
29+
"env": { "RUST_BACKTRACE": "1" }
30+
}
31+
},
32+
{
33+
"label": "Run 32 - Release",
34+
"type": "shell",
35+
"command": "cargo run --release -- ${workspaceFolder}/data/Image-arm32le",
36+
"group": "build",
37+
"options": {
38+
"cwd": "${workspaceFolder}"
39+
}
40+
},
41+
{
42+
"label": "Run 64 - Release",
43+
"type": "shell",
44+
"command": "cargo run --release -- --64 --big ${workspaceFolder}/data/Image-arm64be",
1745
"group": "build",
1846
"options": {
1947
"cwd": "${workspaceFolder}"
@@ -29,4 +57,4 @@
2957
}
3058
},
3159
]
32-
}
60+
}

Cargo.lock

Lines changed: 84 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "rbase"
3-
version = "0.1.2"
3+
version = "0.1.3"
44
edition = "2021"
55
repository = "https://github.com/WorksButNotTested/rbase.git"
66
authors = [ "WorksButNotTested" ]
@@ -37,6 +37,7 @@ install-updater = false
3737

3838
[dependencies]
3939
clap = { version = "4.5.4", features = ["derive"] }
40+
dashmap = { version = "5.5.3", features = ["rayon"] }
4041
indicatif = { version = "0.17.8", features = ["rayon"] }
4142
memmap2 = "0.9.4"
4243
num_cpus = "1.16.0"

data/Image-arm32

-27.4 MB
Binary file not shown.

data/Image-arm32le

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
version https://git-lfs.github.com/spec/v1
2+
oid sha256:243cebc6330729b254fa25be36f67568c1658adb3b82d0736bb8b942928c51f3
3+
size 28739744

data/Image-arm64be

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
version https://git-lfs.github.com/spec/v1
2+
oid sha256:1f78fb74dda2c033f3de3b411d1d34897b3c62c1aa84f4790a3f64a3d28814a7
3+
size 123724360

src/addresses.rs

Lines changed: 34 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,75 +1,64 @@
11
use {
22
crate::progress::Progress,
3-
indicatif::{ParallelProgressIterator, ProgressIterator},
3+
dashmap::DashMap,
4+
indicatif::ParallelProgressIterator,
45
rayon::iter::{IntoParallelRefIterator, ParallelIterator},
5-
std::{collections::HashMap, hash::Hash, mem::size_of},
6+
std::{hash::Hash, mem::size_of, num::TryFromIntError},
67
};
78

89
pub struct Addresses<T> {
910
addresses: Vec<T>,
1011
}
1112

12-
impl<T: Copy + Send + Sync + Default + PartialEq + Eq + Hash> Addresses<T> {
13-
fn read_addresses<F: Fn(&[u8]) -> T + Sync + Send>(bytes: &[u8], convert: F) -> Vec<T> {
13+
impl<
14+
T: Copy
15+
+ Send
16+
+ Sync
17+
+ Default
18+
+ PartialEq
19+
+ Eq
20+
+ Hash
21+
+ TryFrom<usize, Error = TryFromIntError>,
22+
> Addresses<T>
23+
{
24+
fn get_address_frequencies<F: Fn(&[u8]) -> T + Sync + Send>(
25+
bytes: &[u8],
26+
convert: F,
27+
) -> DashMap<T, usize> {
1428
let chunks = bytes.chunks(size_of::<T>()).collect::<Vec<&[u8]>>();
1529
let pb = Progress::get("Reading addresses", chunks.len());
30+
let map = DashMap::<T, usize>::new();
1631
chunks
1732
.par_iter()
1833
.progress_with(pb)
1934
.map(|&p| convert(p))
2035
.filter(|&p| p != T::default())
21-
.collect::<Vec<T>>()
36+
.for_each(|ptr| {
37+
*map.entry(ptr).or_insert(0) += 1;
38+
});
39+
map
2240
}
2341

24-
fn get_freqencies(addresses: Vec<T>) -> Vec<HashMap<T, usize>> {
25-
/* Calculate frequencies in parallel */
26-
let pb = Progress::get("Calculating frequencies", addresses.len());
27-
addresses
42+
fn get_unique_addresses(frequencies: DashMap<T, usize>) -> Vec<T> {
43+
let pb = Progress::get("Finding unique addresses", frequencies.len());
44+
frequencies
2845
.par_iter()
2946
.progress_with(pb)
30-
.fold(HashMap::<T, usize>::new, |mut map, ptr| {
31-
if let Some(v) = map.get(ptr) {
32-
map.insert(*ptr, v + 1);
47+
.filter_map(|r| {
48+
let (&k, &v) = r.pair();
49+
if v == 1 {
50+
Some(k)
3351
} else {
34-
map.insert(*ptr, 1);
52+
None
3553
}
36-
map
3754
})
38-
.collect::<Vec<HashMap<T, usize>>>()
39-
}
40-
41-
fn collate_frequencies(frequencies: Vec<HashMap<T, usize>>) -> HashMap<T, usize> {
42-
let pb = Progress::get("Collating frequencies", frequencies.len());
43-
frequencies.into_iter().progress_with(pb).fold(
44-
HashMap::<T, usize>::new(),
45-
|mut map, chunk| {
46-
for (k, v) in chunk {
47-
if let Some(v) = map.get(&k) {
48-
map.insert(k, v + 1);
49-
} else {
50-
map.insert(k, v);
51-
}
52-
}
53-
map
54-
},
55-
)
56-
}
57-
58-
fn get_unique_addresses(frequencies: HashMap<T, usize>) -> Vec<T> {
59-
let pb = Progress::get("Finding unique addresses", frequencies.len());
60-
frequencies
61-
.par_iter()
62-
.progress_with(pb)
63-
.filter_map(|(k, v)| if *v == 1 { Some(*k) } else { None })
6455
.collect()
6556
}
6657

6758
pub fn new<F: Fn(&[u8]) -> T + Sync + Send + Copy>(bytes: &[u8], convert: F) -> Self {
68-
let addresses = Self::read_addresses(bytes, convert);
69-
println!("Found: {:?} addresses", addresses.len());
70-
let frequencies = Self::get_freqencies(addresses);
71-
let collated = Self::collate_frequencies(frequencies);
72-
let unique = Self::get_unique_addresses(collated);
59+
let frequencies = Self::get_address_frequencies(bytes, convert);
60+
println!("Found: {:?} addresses", frequencies.len());
61+
let unique = Self::get_unique_addresses(frequencies);
7362
println!("Found: {:?} unique addresses", unique.len());
7463
Self { addresses: unique }
7564
}

0 commit comments

Comments
 (0)