Skip to content

Commit f7dcb5f

Browse files
committed
Optimize read_node with slice indexing to reduce bounds checks
- Used slice indexing (e.g., &buf[offset..offset+3]) instead of individual byte indexing. - This allows the compiler to perform a single bounds check for the entire read operation. - Benchmarks show a ~5% improvement in lookup performance (86ns -> 82ns).
1 parent a96dc7a commit f7dcb5f

File tree

1 file changed

+11
-10
lines changed

1 file changed

+11
-10
lines changed

src/reader.rs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -450,9 +450,8 @@ impl<'de, S: AsRef<[u8]>> Reader<S> {
450450
let val = match self.metadata.record_size {
451451
24 => {
452452
let offset = base_offset + index * 3;
453-
(buf[offset] as usize) << 16
454-
| (buf[offset + 1] as usize) << 8
455-
| buf[offset + 2] as usize
453+
let bytes = &buf[offset..offset + 3];
454+
(bytes[0] as usize) << 16 | (bytes[1] as usize) << 8 | bytes[2] as usize
456455
}
457456
28 => {
458457
let middle = if index != 0 {
@@ -461,17 +460,19 @@ impl<'de, S: AsRef<[u8]>> Reader<S> {
461460
(buf[base_offset + 3] & 0xF0) >> 4
462461
};
463462
let offset = base_offset + index * 4;
463+
let bytes = &buf[offset..offset + 3];
464464
(middle as usize) << 24
465-
| (buf[offset] as usize) << 16
466-
| (buf[offset + 1] as usize) << 8
467-
| buf[offset + 2] as usize
465+
| (bytes[0] as usize) << 16
466+
| (bytes[1] as usize) << 8
467+
| bytes[2] as usize
468468
}
469469
32 => {
470470
let offset = base_offset + index * 4;
471-
(buf[offset] as usize) << 24
472-
| (buf[offset + 1] as usize) << 16
473-
| (buf[offset + 2] as usize) << 8
474-
| buf[offset + 3] as usize
471+
let bytes = &buf[offset..offset + 4];
472+
(bytes[0] as usize) << 24
473+
| (bytes[1] as usize) << 16
474+
| (bytes[2] as usize) << 8
475+
| bytes[3] as usize
475476
}
476477
s => {
477478
return Err(MaxMindDbError::invalid_database(format!(

0 commit comments

Comments
 (0)