Skip to content

Commit 5eff1cf

Browse files
authored
Merge pull request #2405 from cruessler/benchmark-line-stats
Add benchmark for counting additions/removals in diff
2 parents 8bceefb + 1c62a8e commit 5eff1cf

3 files changed

Lines changed: 128 additions & 0 deletions

File tree

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

gix-diff/Cargo.toml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,11 @@ wasm = ["dep:getrandom"]
3939
[lib]
4040
doctest = false
4141

42+
[[bench]]
43+
name = "line-count"
44+
harness = false
45+
path = "./benches/line_count.rs"
46+
4247
[dependencies]
4348
gix-index = { version = "^0.46.0", path = "../gix-index", optional = true }
4449
gix-pathspec = { version = "^0.15.0", path = "../gix-pathspec", optional = true }
@@ -63,6 +68,10 @@ bstr = { version = "1.12.0", default-features = false }
6368

6469
document-features = { version = "0.2.0", optional = true }
6570

71+
[dev-dependencies]
72+
criterion = "0.8.0"
73+
imara-diff-v2 = { version = "0.2.0", package = "imara-diff" }
74+
6675
[package.metadata.docs.rs]
6776
all-features = true
6877
features = ["document-features"]

gix-diff/benches/line_count.rs

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
use criterion::{criterion_group, criterion_main, Criterion};
2+
3+
struct BenchmarkTokenSource {
4+
number_of_lines: u32,
5+
skip_every: u32,
6+
}
7+
8+
impl BenchmarkTokenSource {
9+
fn new(number_of_lines: u32, skip_every: u32) -> Self {
10+
Self {
11+
number_of_lines,
12+
skip_every,
13+
}
14+
}
15+
}
16+
17+
struct BenchmarkTokenizer {
18+
number_of_lines: u32,
19+
skip_every: u32,
20+
current: u32,
21+
}
22+
23+
impl BenchmarkTokenizer {
24+
fn new(number_of_lines: u32, skip_every: u32) -> Self {
25+
Self {
26+
number_of_lines,
27+
skip_every,
28+
current: 0,
29+
}
30+
}
31+
}
32+
33+
impl Iterator for BenchmarkTokenizer {
34+
type Item = String;
35+
36+
fn next(&mut self) -> Option<Self::Item> {
37+
if self.current < self.number_of_lines {
38+
let item = self.current.to_string();
39+
40+
self.current += 1;
41+
42+
if self.current % self.skip_every == 0 {
43+
self.current += 1;
44+
}
45+
46+
Some(item)
47+
} else {
48+
None
49+
}
50+
}
51+
}
52+
53+
impl imara_diff::intern::TokenSource for BenchmarkTokenSource {
54+
type Token = String;
55+
56+
type Tokenizer = BenchmarkTokenizer;
57+
58+
fn tokenize(&self) -> Self::Tokenizer {
59+
BenchmarkTokenizer::new(self.number_of_lines, self.skip_every)
60+
}
61+
62+
fn estimate_tokens(&self) -> u32 {
63+
self.number_of_lines
64+
}
65+
}
66+
67+
impl imara_diff_v2::TokenSource for BenchmarkTokenSource {
68+
type Token = String;
69+
70+
type Tokenizer = BenchmarkTokenizer;
71+
72+
fn tokenize(&self) -> Self::Tokenizer {
73+
BenchmarkTokenizer::new(self.number_of_lines, self.skip_every)
74+
}
75+
76+
fn estimate_tokens(&self) -> u32 {
77+
self.number_of_lines
78+
}
79+
}
80+
81+
fn count_lines(c: &mut Criterion) {
82+
let input = imara_diff::intern::InternedInput::new(
83+
BenchmarkTokenSource::new(10_000, 5),
84+
BenchmarkTokenSource::new(10_000, 6),
85+
);
86+
87+
let input_v2 = imara_diff_v2::InternedInput::new(
88+
BenchmarkTokenSource::new(10_000, 5),
89+
BenchmarkTokenSource::new(10_000, 6),
90+
);
91+
92+
c.bench_function("imara-diff 0.1", |b| {
93+
b.iter(|| {
94+
let counters = gix_diff::blob::diff(
95+
gix_diff::blob::Algorithm::Histogram,
96+
&input,
97+
gix_diff::blob::sink::Counter::default(),
98+
);
99+
100+
assert_eq!(counters.insertions, 1666);
101+
assert_eq!(counters.removals, 1333);
102+
});
103+
});
104+
c.bench_function("imara-diff 0.2", |b| {
105+
b.iter(|| {
106+
let diff = imara_diff_v2::Diff::compute(imara_diff_v2::Algorithm::Histogram, &input_v2);
107+
108+
let additions = diff.count_additions();
109+
let removals = diff.count_removals();
110+
111+
assert_eq!(additions, 1666);
112+
assert_eq!(removals, 1333);
113+
});
114+
});
115+
}
116+
117+
criterion_group!(benches, count_lines);
118+
criterion_main!(benches);

0 commit comments

Comments
 (0)