Optimize escape function for small strings

This commit is contained in:
Kogia-sima 2020-06-10 10:56:25 +09:00
parent 53f0db024c
commit aea4e02259
3 changed files with 19 additions and 12 deletions

View File

@ -16,18 +16,20 @@ const VECTOR_ALIGN: usize = VECTOR_BYTES - 1;
#[target_feature(enable = "avx2")]
pub unsafe fn escape(buffer: &mut Buffer, bytes: &[u8]) {
let len = bytes.len();
let mut start_ptr = bytes.as_ptr();
let end_ptr = start_ptr.add(len);
if len < VECTOR_BYTES {
if len < 16 {
naive::escape(buffer, start_ptr, start_ptr, end_ptr);
} else {
sse2::escape(buffer, bytes);
}
if len < 8 {
let start_ptr = bytes.as_ptr();
let end_ptr = start_ptr.add(len);
naive::escape(buffer, start_ptr, start_ptr, end_ptr);
return;
} else if len < VECTOR_BYTES {
sse2::escape(buffer, bytes);
return;
}
let mut start_ptr = bytes.as_ptr();
let end_ptr = start_ptr.add(len);
let v_independent1 = _mm256_set1_epi8(4);
let v_independent2 = _mm256_set1_epi8(2);
let v_key1 = _mm256_set1_epi8(0x26);

View File

@ -38,6 +38,7 @@ fn contains_key(x: usize) -> bool {
contains_zero_byte(z1) || contains_zero_byte(z2)
}
#[inline]
pub unsafe fn escape(buffer: &mut Buffer, bytes: &[u8]) {
let len = bytes.len();
let mut start_ptr = bytes.as_ptr();

View File

@ -17,14 +17,16 @@ const VECTOR_ALIGN: usize = VECTOR_BYTES - 1;
#[inline]
pub unsafe fn escape(buffer: &mut Buffer, bytes: &[u8]) {
let len = bytes.len();
let mut start_ptr = bytes.as_ptr();
let end_ptr = start_ptr.add(len);
if bytes.len() < VECTOR_BYTES {
if len < VECTOR_BYTES {
let start_ptr = bytes.as_ptr();
let end_ptr = start_ptr.add(len);
naive::escape(buffer, start_ptr, start_ptr, end_ptr);
return;
}
let mut start_ptr = bytes.as_ptr();
let end_ptr = start_ptr.add(len);
let v_independent1 = _mm_set1_epi8(4);
let v_independent2 = _mm_set1_epi8(2);
let v_key1 = _mm_set1_epi8(0x26);
@ -66,6 +68,8 @@ pub unsafe fn escape(buffer: &mut Buffer, bytes: &[u8]) {
escape_aligned(buffer, start_ptr, ptr, end_ptr);
}
#[target_feature(enable = "sse2")]
#[inline]
pub unsafe fn escape_aligned(
buffer: &mut Buffer,
mut start_ptr: *const u8,