Skip to content

Commit 974641f

Browse files
committed
More benchmarks and add shortcircuiting logic to validate_ascii_fast
1 parent 0ba7d62 commit 974641f

File tree

4 files changed

+40
-15
lines changed

4 files changed

+40
-15
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
prelude: |
2+
ascii1 = [*"a".."m",*"N".."Z",*"0".."9"].join("")
3+
ascii10 = ascii1 * 10
4+
ascii100 = ascii10 * 10
5+
ascii1000 = ascii100 * 10
6+
7+
utf81 = [*"a".."m",*"N".."Z", "éà€‹›Ç☃"].join("")
8+
utf810 = utf81 * 10
9+
utf8100 = utf810 * 10
10+
utf81000 = utf8100 * 10
11+
12+
invalid_ascii_last = ascii1000 + "☃"
13+
invalid_ascii_first = "☃" + ascii1000
14+
benchmark:
15+
ascii-coderange-scan-1: ascii1.force_encoding(Encoding::UTF_8).valid_encoding?
16+
ascii-coderange-scan-10: ascii10.force_encoding(Encoding::UTF_8).valid_encoding?
17+
ascii-coderange-scan-100: ascii100.force_encoding(Encoding::UTF_8).valid_encoding?
18+
ascii-coderange-scan-1000: ascii1000.force_encoding(Encoding::UTF_8).valid_encoding?
19+
20+
utf8-coderange-scan-1: utf81.force_encoding(Encoding::UTF_8).valid_encoding?
21+
utf8-coderange-scan-10: utf810.force_encoding(Encoding::UTF_8).valid_encoding?
22+
utf8-coderange-scan-100: utf8100.force_encoding(Encoding::UTF_8).valid_encoding?
23+
utf8-coderange-scan-1000: utf81000.force_encoding(Encoding::UTF_8).valid_encoding?
24+
25+
ascii-coderange-scan-first-1: invalid_ascii_first.force_encoding(Encoding::ASCII).valid_encoding?
26+
ascii-coderange-scan-last-1: invalid_ascii_last.force_encoding(Encoding::ASCII).valid_encoding?

benchmark/string_coderange_scan_ascii.rb

Lines changed: 0 additions & 5 deletions
This file was deleted.

benchmark/string_coderange_scan_utf8.rb

Lines changed: 0 additions & 5 deletions
This file was deleted.

simd_encoding_check.h

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,22 @@ static bool validate_ascii_fast(const char *src, size_t len) {
2323
for (; i <= len - 32; i += 32) {
2424
__m256i current_bytes = _mm256_loadu_si256((const __m256i *)(src + i));
2525
has_error = _mm256_or_si256(has_error, current_bytes);
26+
if (_mm256_movemask_epi8(has_error)) {
27+
return false;
28+
}
2629
}
2730
}
2831
int error_mask = _mm256_movemask_epi8(has_error);
2932

3033
char tail_has_error = 0;
3134
for (; i < len; i++) {
35+
if (src[i] & 0x80) {
36+
return false;
37+
}
3238
tail_has_error |= src[i];
3339
}
34-
error_mask |= (tail_has_error & 0x80);
3540

36-
return !error_mask;
41+
return true;
3742
}
3843

3944

@@ -242,17 +247,21 @@ static bool validate_ascii_fast(const char *src, size_t len) {
242247
for (; i <= len - 16; i += 16) {
243248
__m128i current_bytes = _mm_loadu_si128((const __m128i *)(src + i));
244249
has_error = _mm_or_si128(has_error, current_bytes);
250+
if (_mm_movemask_epi8(has_error)) {
251+
return false;
252+
}
245253
}
246254
}
247-
int error_mask = _mm_movemask_epi8(has_error);
248255

249256
char tail_has_error = 0;
250257
for (; i < len; i++) {
258+
if (src[i] & 0x80) {
259+
return false;
260+
}
251261
tail_has_error |= src[i];
252262
}
253-
error_mask |= (tail_has_error & 0x80);
254263

255-
return !error_mask;
264+
return true;
256265
}
257266

258267
/*

0 commit comments

Comments
 (0)