Branch optimization in naive escape

This commit is contained in:
Kogia-sima 2020-12-18 18:28:21 +09:00
parent fe11aff782
commit bf55dd7909
1 changed files with 8 additions and 4 deletions

View File

@ -30,7 +30,9 @@ pub(super) unsafe fn proceed(
debug_assert!(start_ptr <= ptr); debug_assert!(start_ptr <= ptr);
let idx = ESCAPE_LUT[*ptr as usize] as usize; let idx = ESCAPE_LUT[*ptr as usize] as usize;
debug_assert!(idx <= 9); debug_assert!(idx <= 9);
if unlikely!(idx < ESCAPED_LEN) { if likely!(idx >= ESCAPED_LEN) {
ptr = ptr.add(1);
} else {
if ptr > start_ptr { if ptr > start_ptr {
let slc = let slc =
slice::from_raw_parts(start_ptr, ptr as usize - start_ptr as usize); slice::from_raw_parts(start_ptr, ptr as usize - start_ptr as usize);
@ -38,9 +40,9 @@ pub(super) unsafe fn proceed(
} }
buffer.push_str(*ESCAPED.get_unchecked(idx)); buffer.push_str(*ESCAPED.get_unchecked(idx));
start_ptr = ptr.add(1); start_ptr = ptr.add(1);
}
ptr = ptr.add(1); ptr = ptr.add(1);
} }
}
debug_assert_eq!(ptr, end_ptr); debug_assert_eq!(ptr, end_ptr);
debug_assert!(start_ptr <= ptr); debug_assert!(start_ptr <= ptr);
@ -57,7 +59,9 @@ pub(super) unsafe fn escape_small(feed: &str, mut buf: *mut u8) -> usize {
debug_assert!(start_ptr <= ptr); debug_assert!(start_ptr <= ptr);
let idx = *ESCAPE_LUT.get_unchecked(*ptr as usize) as usize; let idx = *ESCAPE_LUT.get_unchecked(*ptr as usize) as usize;
debug_assert!(idx <= 9); debug_assert!(idx <= 9);
if unlikely!(idx < ESCAPED_LEN) { if likely!(idx >= ESCAPED_LEN) {
ptr = ptr.add(1);
} else {
let escaped = ESCAPED.get_unchecked(idx); let escaped = ESCAPED.get_unchecked(idx);
if ptr > start_ptr { if ptr > start_ptr {
let len = ptr as usize - start_ptr as usize; let len = ptr as usize - start_ptr as usize;
@ -68,9 +72,9 @@ pub(super) unsafe fn escape_small(feed: &str, mut buf: *mut u8) -> usize {
memcpy_16(escaped.as_ptr(), buf, escaped.len()); memcpy_16(escaped.as_ptr(), buf, escaped.len());
buf = buf.add(escaped.len()); buf = buf.add(escaped.len());
start_ptr = ptr.add(1); start_ptr = ptr.add(1);
}
ptr = ptr.add(1); ptr = ptr.add(1);
} }
}
debug_assert_eq!(ptr, end_ptr); debug_assert_eq!(ptr, end_ptr);
debug_assert!(start_ptr <= ptr); debug_assert!(start_ptr <= ptr);