On Fri, 15 Jan 2021 20:14:48 GMT, Roger Riggs <rri...@openjdk.org> wrote:

>> Since we're calculating two final values, that split was what necessitated a 
>> `Result` object. Until valhalla I don't think there's a way to get rid of 
>> the performance cost here without putting the bulk of the logic into the 
>> constructor.
>> 
>> Refactoring out some of the logic to utility methods could be a performance 
>> neutral way to cut down the complexity, though. E.g.:
>>                                  char c = (char)((b1 << 12) ^
>>                                                 (b2 <<  6) ^
>>                                                 (b3 ^
>>                                                  (((byte) 0xE0 << 12) ^
>>                                                   ((byte) 0x80 <<  6) ^
>>                                                   ((byte) 0x80 <<  0))));
>>                                 if (Character.isSurrogate(c)) {
>>                                     putChar(dst, dp++, REPL);
>>                                 } else {
>>                                     putChar(dst, dp++, c);
>>                                 }
>> could be reasonably factored out and reduced to something like:
>>                                 putChar(dst, dp++, StringCoding.decode3(b1, 
>> b2, b3));
>> I've refrained from refurbishing too much, though.
>
> I don't think you need to inline quite so much.  Once the determination has 
> been made about whether the result is Latin1 or UTF16 it calls separate 
> methods anyway.  For example, after calling hasNegatives() it is known what 
> coding is needed.
> Then call out to a method returns the byte array.

(Also, every email is very long because it includes the performance data; next 
time please put the performance data in a separate comment, not the PR).

-------------

PR: https://git.openjdk.java.net/jdk/pull/2102

Reply via email to