Your patch looks good to me, and will get the majority of performance
benefits without any API issues.

Isaac


On Tue, Apr 24, 2018 at 9:38 PM, Xueming Shen <xueming.s...@oracle.com> wrote:
> for String based replaceAll/First() it might be worth doing something like
>
> http://cr.openjdk.java.net/~sherman/regex_removesb/webrev/
>
>
> On 4/24/18, 10:47 AM, Isaac Levy wrote:
>>
>> Hi Sherman,
>>
>> Thanks for clarifying. Looks like exceptions are caused by invalid
>> format string. I wouldn't expect most programs to be catching this and
>> preserving their buffer, but dunno.
>>
>> How much does it affect perf? Well it depends on use case, a jmh of
>> replaceAll with a length 200 string of digits and regex "(\w)" shows
>> about 30% speedup.
>>
>> [info] Benchmark          Mode  Cnt   Score   Error  Units
>> [info] origM  avgt   10  11.669 ± 0.211  us/op
>> [info] newM   avgt   10   8.926 ± 0.095  us/op
>>
>> Isaac
>>
>>
>> On Tue, Apr 24, 2018 at 12:53 PM, Xueming Shen<xueming.s...@oracle.com>
>> wrote:
>>>
>>> Hi Isaac,
>>>
>>> I actually meant to say "we are not supposed to output the partial text
>>> into
>>> the output buffer in case of an exception". It has nothing to do with the
>>> changeset you cited. This has been the behavior since day one/JDK1.4,
>>> though it is not specified explicitly in the API doc. The newly added
>>> StringBuilder variant simply follows this behavior. If it's really
>>> desired
>>> it
>>> is kinda doable to save that StringBuilder without the "incompatible"
>>> behavior
>>> change but just wonder if it is really worth the effort.
>>>
>>> Thanks,
>>> Sherman
>>>
>>>
>>> On 4/24/18, 9:11 AM, Isaac Levy wrote:
>>>>
>>>> (moving this to a separate discussion)
>>>>
>>>>
>>>> --- a/src/java.base/share/classes/java/util/regex/Matcher.java
>>>> +++ b/src/java.base/share/classes/java/util/regex/Matcher.java
>>>> @@ -993,13 +993,11 @@
>>>>       public Matcher appendReplacement(StringBuilder sb, String
>>>> replacement) {
>>>>            // If no match, return error
>>>>            if (first<   0)
>>>>                throw new IllegalStateException("No match available");
>>>> -        StringBuilder result = new StringBuilder();
>>>> -        appendExpandedReplacement(replacement, result);
>>>>            // Append the intervening text
>>>>            sb.append(text, lastAppendPosition, first);
>>>>            // Append the match substitution
>>>> +        appendExpandedReplacement(replacement, sb);
>>>> -        sb.append(result);
>>>>
>>>>
>>>>
>>>> On Mon, Apr 23, 2018 at 5:05 PM Xueming Shen<xueming.s...@oracle.com>
>>>> wrote:
>>>>>
>>>>>
>>>>> I would assume in case of an exception thrown from
>>>>> appendExpandedReplacement() we don't
>>>>> want "text" to be pushed into the "sb".
>>>>>
>>>>> -sherman
>>>>
>>>>
>>>> Perhaps. Though the behavior under exception is undefined and this
>>>> function is probably primarily used though the replaceAll API, which
>>>> wouldn’t return the intermediate sb under the case of exception.
>>>>
>>>> My reading of the blame was the temp StringBuilder was an artifact of
>>>> the api previously using StringBuffer externally.  See
>>>> http://hg.openjdk.java.net/jdk9/dev/jdk/rev/763c564451b3
>>>
>>>
>

Reply via email to