Proposal: optimization of Map.copyOf and Collectors.toUnmodifiableMap

Stuart Marks stuart.marks at oracle.com
Tue Jun 26 01:16:34 UTC 2018


Hi Peter,

Sorry for the delay again. I got pulled into a P1 escalation.

I don't think I'll have time to look at this in any detail until after JDK 11 
ramp-down.

s'marks


On 6/22/18 9:51 AM, Peter Levart wrote:
> Hi Stuart,
>
> Do you still fear that "single-threaded-object" idiom is not safe?
>
> I would just like to comment on the last approach...
>
> On 06/19/2018 07:01 PM, Peter Levart wrote:
>> Here's another attempt that uses the same technique but relaxes the possible 
>> concurrent source map scenario (where number of pairs emitted by 
>> Map.forEach() doesn't agree with Map.size()):
>>
>> http://cr.openjdk.java.net/~plevart/jdk-dev/UnmodifiableMap_copyOf/webrev.03/
>>
>> The construction is moved entirely into a separate MapBuilder object. The 
>> builder is used for Map.of(...) methods too.
>>
>> Here are the benchmark results that show improvements in every respect 
>> touched by the patch:
>>
>> http://cr.openjdk.java.net/~plevart/jdk-dev/UnmodifiableMap_copyOf/UnmodifiableMapBench_results.txt 
>>
>>
>> Here are the JMH benchmarks used to produce these results:
>>
>> http://cr.openjdk.java.net/~plevart/jdk-dev/UnmodifiableMap_copyOf/UnmodifiableMapCollectorBench.java 
>>
>> http://cr.openjdk.java.net/~plevart/jdk-dev/UnmodifiableMap_copyOf/UnmodifiableMapCopyOfBench.java 
>>
>> http://cr.openjdk.java.net/~plevart/jdk-dev/UnmodifiableMap_copyOf/UnmodifiableMapOfBench.java 
>>
>>
>>
>> So what do you think of this one?
>>
>> Regards, Peter 
>
> When this is used to copy concurrently changing concurrent Map, it has 
> approximately the same performance consequence as when using 
> Map.entrySet().toArray(). Either logic uses the estimated size to pre-size the 
> array, but when the size is a moving target, it fails, so it has to do another 
> copy at the end. My approach uses the estimated size to collect elements into 
> the ready-made hash-table. When it fails, it has to do another copy, but in 
> general case when the estimate is correct, it doesn't need an intermediary 
> representation in the form of array, so it can be more optimal.
>
> Regards, Peter
>



More information about the core-libs-dev mailing list