Improve verification performance
Port the hashing performance improvements to the verifier: - Wrap file in a BufReader - Hash all read data at the same time type: performance
This commit is contained in:
parent
9dea195694
commit
6f4f8e7595
|
@ -107,12 +107,11 @@ impl Hasher {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
bytes_hashed += bytes_read;
|
|
||||||
|
|
||||||
let read = &remaining[..bytes_read];
|
let read = &remaining[..bytes_read];
|
||||||
|
|
||||||
self.sha1.update(read);
|
self.sha1.update(read);
|
||||||
|
|
||||||
|
bytes_hashed += bytes_read;
|
||||||
self.piece_bytes_hashed += bytes_read;
|
self.piece_bytes_hashed += bytes_read;
|
||||||
|
|
||||||
if self.piece_bytes_hashed == self.piece_length {
|
if self.piece_bytes_hashed == self.piece_length {
|
||||||
|
|
|
@ -71,36 +71,31 @@ impl<'a> Verifier<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn hash(&mut self, path: &Path) -> io::Result<()> {
|
pub(crate) fn hash(&mut self, path: &Path) -> io::Result<()> {
|
||||||
let mut file = File::open(path)?;
|
let mut file = BufReader::new(File::open(path)?);
|
||||||
|
|
||||||
let mut remaining = path.metadata()?.len();
|
loop {
|
||||||
|
let remaining = &mut self.buffer[..self.piece_length - self.piece_bytes_hashed];
|
||||||
|
|
||||||
while remaining > 0 {
|
let bytes_read = file.read(remaining)?;
|
||||||
let to_buffer: usize = remaining
|
|
||||||
.min(self.buffer.len().into_u64())
|
|
||||||
.try_into()
|
|
||||||
.invariant_unwrap("min with usize should fit in usize");
|
|
||||||
|
|
||||||
let buffer = &mut self.buffer[0..to_buffer];
|
if bytes_read == 0 {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
file.read_exact(buffer)?;
|
let read = &remaining[..bytes_read];
|
||||||
|
|
||||||
for byte in buffer.iter().cloned() {
|
self.sha1.update(read);
|
||||||
self.sha1.update(&[byte]);
|
|
||||||
|
|
||||||
self.piece_bytes_hashed += 1;
|
self.piece_bytes_hashed += bytes_read;
|
||||||
|
|
||||||
if self.piece_bytes_hashed == self.piece_length {
|
if self.piece_bytes_hashed == self.piece_length {
|
||||||
self.pieces.push(self.sha1.digest().into());
|
self.pieces.push(self.sha1.digest().into());
|
||||||
self.sha1.reset();
|
self.sha1.reset();
|
||||||
self.piece_bytes_hashed = 0;
|
self.piece_bytes_hashed = 0;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
remaining -= buffer.len().into_u64();
|
|
||||||
|
|
||||||
if let Some(progress_bar) = &self.progress_bar {
|
if let Some(progress_bar) = &self.progress_bar {
|
||||||
progress_bar.inc(to_buffer.into_u64());
|
progress_bar.inc(bytes_read.into_u64());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user