Review patches isBMPCodePoint/2/3

Ulf Zibis Ulf.Zibis at gmx.de
Thu Mar 25 22:19:34 UTC 2010


Am 25.03.2010 22:47, schrieb Martin Buchholz:
> Here's another minor performance tweak to
>
>      public String(int[] codePoints, int offset, int count) {
>
> that optimizes for BMP.
>
>          // Pass 1: Compute precise size of char[]
>          int n = count;
>          for (int i = offset; i<  end; i++) {
>              int c = codePoints[i];
>              if (Character.isBMPCodePoint(c))
>                  ;
>              else if (Character.isSupplementaryCodePoint(c))
>                  n++;
>              else throw new IllegalArgumentException(Integer.toString(c));
>          }
>    

Yes, this is a valuable pattern, you found out.
I think, it could look smarter/more clear:

             if (Character.isBMPCodePoint(c))
                 continue;
             if (Character.isSupplementaryCodePoint(c))
                 n++;
             else
                 throw new IllegalArgumentException(Integer.toString(c));

And this would be faster, as isSupplementaryCodePoint is not optimized 
for following isBMPCodePoint:

             if (Character.isBMPCodePoint(c))
                 continue;
             if (!Character.isValidCodePoint(c))
                 throw new IllegalArgumentException(Integer.toString(c));
             n++;

Before you go to the meeting, maybe scan the JDK for similar use cases, 
before I get addicted too, and don't forget to define c as final.
It's enough, that I'm addicted from:
         // fill backwards for VM performance reasons, reduces register 
pressure, faster compare against 0
         for (int i = end; n > 0; ) {
             int c = codePoints[--i];
             if (Character.isBMPCodePoint(c))
                 v[--n] = (char)c;
             else
                 Character.toSurrogates(c, v, n-=2);
         }

-Ulf


> http://cr.openjdk.java.net/~martin/webrevs/openjdk7/public-isBMPCodePoint/
>
> Martin
>
>
>    




More information about the core-libs-dev mailing list