8058779: Faster implementation of String.replace(CharSequence, CharSequence)

Ivan Gerasimov ivan.gerasimov at oracle.com
Sun May 31 16:03:54 UTC 2015



On 31.05.2015 18:54, Ivan Gerasimov wrote:
> Hi Remi!
>
> On 31.05.2015 11:43, Remi Forax wrote:
>> I agree with the others the code is more readable.
>>
>> There is a slightly difference between the current behavior and the 
>> behavior of the proposed code,
>>   "foo".replace("bar", null)
>> should throw a NPE because replacement is null but the proposed code 
>> will return "foo"
>> because replacement.toString() is called after the short-circuit test 
>> (j < 0).
>>
> Yes, you're right, thanks for catching it!
> And the regression test should have caught that, but I only had 
> "a".replace("a", null) there, which passed.
>
> I fixed the code and added the case to the regression test in the new 
> webrev.
>
Which is right here:
http://cr.openjdk.java.net/~igerasim/8058779/05/webrev/

>> so the first part of the code should be:
>>   String starget = target.toString();  // implict nullcheck
>>   String srepl = replacement.toString();  // implicit nullcheck
>>   int j = indexOf(starget);
>>   if (j < 0) {
>>     return this;
>>   }
>>   ...
>>
>> also 'i' can be initialized just before the 'do', there is no point 
>> to initialize it before.
>>
>> To finish, the two 'final' are useless here but i suppose it's a 
>> matter of style :)
>>
> I moved declaration of i just to save a line.  I don't think it 
> decreased performance.
>
> Declaring the 'value' variable final was suggested by Martin, and I 
> think it is reasonable (see 
> http://mail.openjdk.java.net/pipermail/core-libs-dev/2015-March/032601.html).
> The other variable is final just for symmetry :)
>
> Sincerely yours,
> Ivan
>
>
>> cheers,
>> Rémi
>>
>>
>> On 05/31/2015 04:19 AM, Ivan Gerasimov wrote:
>>> Hi everyone!
>>>
>>> Here's another webrev, in which replace() is implemented with 
>>> StringBuilder.
>>> On my benchmark it is almost as fast as the version backed with 
>>> arrays, but this variant is much shorter.
>>>
>>> Credits to Sherman for combining the general algorithm with the case 
>>> of empty target.
>>>
>>> Comments, further suggestions are welcome!
>>>
>>> BUGURL: https://bugs.openjdk.java.net/browse/JDK-8058779
>>> WEBREV: http://cr.openjdk.java.net/~igerasim/8058779/04/webrev/
>>>
>>> Sincerely yours,
>>> Ivan
>>>
>>
>>
>>
>
>
>




More information about the core-libs-dev mailing list