This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
is_utf8_invariant_string(): small speed optimization
authorKarl Williamson <khw@cpan.org>
Fri, 8 Dec 2017 17:20:24 +0000 (10:20 -0700)
committerKarl Williamson <khw@cpan.org>
Sat, 9 Dec 2017 05:27:44 +0000 (22:27 -0700)
By pulling a test out of a while loop condition and doing it before the
while starts, we don't increase the number of conditionals; instead we
avoid doing the conditional each time through, and also skip
some conditionals for strings shorter than a word.

inline.h

index 98d9edc..0268e59 100644 (file)
--- a/inline.h
+++ b/inline.h
@@ -406,9 +406,11 @@ S_is_utf8_invariant_string_loc(const U8* const s, STRLEN len, const U8 ** ep)
 #    error Unexpected word size
 #  endif
 
+    if ((STRLEN) (send - x) >= PERL_WORDSIZE) {
+
     /* Process per-byte until reach word boundary.  XXX This loop could be
      * eliminated if we knew that this platform had fast unaligned reads */
-    while (x < send && (PTR2nat(x) & PERL_WORD_BOUNDARY_MASK)) {
+        while (PTR2nat(x) & PERL_WORD_BOUNDARY_MASK) {
         if (! UTF8_IS_INVARIANT(*x)) {
             if (ep) {
                 *ep = x;
@@ -434,6 +436,7 @@ S_is_utf8_invariant_string_loc(const U8* const s, STRLEN len, const U8 ** ep)
         }
         x += PERL_WORDSIZE;
     }
+    }
 
 #  undef PERL_WORDCAST
 #  undef PERL_WORDSIZE