Skip to content

Commit d311bf6

Browse files
Merge pull request #277 from unhappychoice/feature/refactor-extractor-services
refactor: redesign extractor services with performance optimizations
2 parents aa0ab0f + 7255342 commit d311bf6

File tree

113 files changed

+17327
-1838
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

113 files changed

+17327
-1838
lines changed

Cargo.lock

Lines changed: 165 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,20 @@ sha2 = "0.10"
8282
[dev-dependencies]
8383
paste = "1.0"
8484
insta = "1.43"
85+
criterion = "0.5"
8586
gittype = { path = ".", default-features = false, features = ["test-mocks"] }
8687

8788
[features]
8889
default = []
8990
test-mocks = []
9091

92+
[[bench]]
93+
name = "challenge_generator_bench"
94+
harness = false
95+
96+
[[bench]]
97+
name = "source_code_parser_bench"
98+
harness = false
99+
100+
101+
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
use criterion::{black_box, criterion_group, criterion_main, Criterion};
2+
use gittype::domain::models::{CodeChunk, ExtractionOptions, Languages};
3+
use gittype::domain::services::challenge_generator::ChallengeGenerator;
4+
use gittype::domain::services::source_code_parser::SourceCodeParser;
5+
use gittype::presentation::game::models::StepType;
6+
use gittype::presentation::game::screens::loading_screen::ProgressReporter;
7+
use std::path::PathBuf;
8+
use std::sync::{Arc, Mutex};
9+
10+
// Mock ProgressReporter for benchmarking
11+
#[derive(Debug, Default)]
12+
struct BenchProgressReporter {
13+
#[allow(clippy::type_complexity)]
14+
count_calls: Arc<Mutex<Vec<(StepType, usize, usize, Option<String>)>>>,
15+
}
16+
17+
impl BenchProgressReporter {
18+
fn new() -> Self {
19+
Self::default()
20+
}
21+
}
22+
23+
impl ProgressReporter for BenchProgressReporter {
24+
fn set_step(&self, _step_type: StepType) {}
25+
26+
fn set_current_file(&self, _file: Option<String>) {}
27+
28+
fn set_file_counts(
29+
&self,
30+
step_type: StepType,
31+
processed: usize,
32+
total: usize,
33+
current_file: Option<String>,
34+
) {
35+
self.count_calls
36+
.lock()
37+
.unwrap()
38+
.push((step_type, processed, total, current_file));
39+
}
40+
}
41+
42+
fn create_real_chunks_from_fixture(fixture_filename: &str) -> Vec<CodeChunk> {
43+
let fixture_path = PathBuf::from("tests/fixtures").join(fixture_filename);
44+
if !fixture_path.exists() {
45+
return Vec::new();
46+
}
47+
48+
let mut parser = SourceCodeParser::new().expect("Failed to create parser");
49+
let rust_lang = Languages::from_extension("rs").expect("Failed to get Rust language");
50+
let options = ExtractionOptions::default();
51+
let progress = BenchProgressReporter::new();
52+
let files_to_process = vec![(fixture_path, rust_lang)];
53+
54+
parser
55+
.extract_chunks_with_progress(files_to_process, &options, &progress)
56+
.unwrap_or_else(|_| Vec::new())
57+
}
58+
59+
fn benchmark_challenge_generator(c: &mut Criterion) {
60+
let generator = ChallengeGenerator::new();
61+
let progress = BenchProgressReporter::new();
62+
63+
// Get all chunks from all fixtures
64+
let mut all_chunks = create_real_chunks_from_fixture("complex_rust_service.rs");
65+
all_chunks.extend(create_real_chunks_from_fixture("complex_commented_rust.rs"));
66+
67+
c.bench_function("challenge_generator_all_chunks", |b| {
68+
b.iter(|| {
69+
let challenges = generator
70+
.convert_with_progress(black_box(all_chunks.clone()), black_box(&progress));
71+
black_box(challenges)
72+
})
73+
});
74+
}
75+
76+
criterion_group!(benches, benchmark_challenge_generator);
77+
criterion_main!(benches);

0 commit comments

Comments
 (0)