diff options
author | Omer Ben-Amram <omerbenamram@gmail.com> | 2019-05-15 23:40:41 +0300 |
---|---|---|
committer | Omer Ben-Amram <omerbenamram@gmail.com> | 2019-05-15 23:40:41 +0300 |
commit | 04258b6e4890d504fecd78acabf1ebfa68b1167c (patch) | |
tree | 6f8330da1d7be6267aec818fdf85fa7da49a1c31 /src | |
parent | 7f3aeea178b23d46fbc47e8af50623559d16c25e (diff) |
added benchmark
Diffstat (limited to 'src')
-rw-r--r-- | src/benches/benchmark.rs | 19 | ||||
-rw-r--r-- | src/mft.rs | 25 |
2 files changed, 41 insertions, 3 deletions
diff --git a/src/benches/benchmark.rs b/src/benches/benchmark.rs index ce8532e..e2d0fee 100644 --- a/src/benches/benchmark.rs +++ b/src/benches/benchmark.rs @@ -3,7 +3,7 @@ extern crate criterion; extern crate mft; use criterion::Criterion; -use mft::MftParser; +use mft::{MftEntry, MftParser}; fn process_1000_mft_records(sample: &[u8]) { let mut parser = MftParser::from_buffer(sample.to_vec()).unwrap(); @@ -16,6 +16,21 @@ fn process_1000_mft_records(sample: &[u8]) { } } +fn get_full_path(sample: &[u8]) { + let mut parser = MftParser::from_buffer(sample.to_vec()).unwrap(); + + let mut paths = Vec::with_capacity(100); + let entries: Vec<MftEntry> = parser + .iter_entries() + .take(100) + .filter_map(Result::ok) + .collect(); + + for entry in entries { + paths.push(parser.get_full_path_for_entry(&entry)); + } +} + fn criterion_benchmark(c: &mut Criterion) { let sample = include_bytes!("../../samples/MFT"); @@ -23,6 +38,8 @@ fn criterion_benchmark(c: &mut Criterion) { c.bench_function("read 1000 records", move |b| { b.iter(|| process_1000_mft_records(sample)) }); + + c.bench_function("get_full_path", move |b| b.iter(|| get_full_path(sample))); } criterion_group!(benches, criterion_benchmark); @@ -127,6 +127,7 @@ impl<T: ReadSeek> MftParser<T> { } } else { let root = PathBuf::from(filename_header.name); + self.entries_cache .insert(entry.header.entry_reference.entry, root.clone()); return Ok(Some(root)); @@ -141,8 +142,7 @@ impl<T: ReadSeek> MftParser<T> { #[cfg(test)] mod tests { use crate::tests::fixtures::mft_sample; - use crate::MftParser; - use std::path::PathBuf; + use crate::{MftEntry, MftParser}; // entrypoint for clion profiler. #[test] @@ -160,6 +160,27 @@ mod tests { } #[test] + fn test_get_full_path() { + let sample = mft_sample(); + let mut parser = MftParser::from_path(sample).unwrap(); + + let mut paths = Vec::with_capacity(1000); + let entries: Vec<MftEntry> = parser + .iter_entries() + .take(1000) + .filter_map(Result::ok) + .collect(); + + for entry in entries { + if let Some(path) = parser.get_full_path_for_entry(&entry).unwrap() { + paths.push(path) + } + } + + assert_eq!(paths.len(), 988); + } + + #[test] fn test_get_full_name() { let sample = mft_sample(); let mut parser = MftParser::from_path(sample).unwrap(); |