RFR JDK-8187653: Lock in CoderResult.Cache becomes performance bottleneck
Roger Riggs
Roger.Riggs at Oracle.com
Thu Mar 1 19:42:52 UTC 2018
Hi Sherman,
Looks to be a good fix with predictable behavior and performance.
+1, Roger
On 2/23/2018 8:26 PM, Xueming Shen wrote:
> Hi,
>
> Please help review the proposed change to remove the potential
> performance
> bottleneck in CoderResult caused by the "over" synchronization the cache
> mechanism.
>
> issue: https://bugs.openjdk.java.net/browse/JDK-8187653
> webrev: http://cr.openjdk.java.net/~sherman/8187653/webrev
>
> Notes:
> While the original test case (new String/String.getBytes() with UTF8
> as showed in the
> stacktrace) described in the bug report might no longer be
> reproducible in jdk9, as
> we have been optimizing lots of String related char[]/byte[] coding
> path away from
> the paths that use CoderResult. But it is still a concern/issue for
> the "general"
> CharsetDe/Encoder.de/encode() operation, in which the malformed or
> unmappable
> CoderResult object is returned.
>
> As showed in the "[synchronized]" section in bm.scores [1], which is
> from the simple
> jmh benchmark test CoderResultBM.java [2], the sores are getting
> significant worse
> when the number of concurrent de/encoding threads gets bigger.
>
> It appears the easy fix is to replace the sync mechanism from "method
> synchronized
> + HashMap" to "ConcurrentHashMap" solves the problem, as showed in
> the same bm
> result [1] in [ConcurrentHashMap] section, because most of the
> accesses to the caching
> HashMap is read operation. The ConcurrentHahsMap's "almost non-block
> for retrieval
> operation" really helps here.
>
> There is another fact that might help us optimize further here. For
> most of our charsets
> in JDK repository (with couple exceptions), the length of malformed
> and unmappable
> CoderResult that these charsets might trigger actually is never longer
> than 4. So we might
> not need to access the ConcurrentHashMap cache at all in normal use
> scenario. I'm putting
> a CoderResult[4] on top the hashmap cache in proposed webrev. It does
> not improve the
> performance significantly, but when the thread number gets bigger, a
> 10%+ improvement
> is observed. So I would assume it might be something worth doing,
> given its cost is really
> low.
>
> Thanks,
> Sherman
>
>
> [1] http://cr.openjdk.java.net/~sherman/8187653/bm.scores
> [2] http://cr.openjdk.java.net/~sherman/8187653/CoderResultBM.java
> [3] http://cr.openjdk.java.net/~sherman/8187653/bm.scores.ms932
>
More information about the core-libs-dev
mailing list