RFR: 8247532: Records deserialization is slow

Chris Hegarty chris.hegarty at oracle.com
Mon Jun 22 11:23:14 UTC 2020


Peter,

Thank you for taking the suggestion for additional test scenarios, improving coverage, and finding-and-fixing the issues in my hurried test builder (was only meant as a rough guide/idea).

I agree with Claes, it would be good to include the microbenchmark in test/micro/..

I think this version, 0.6, is very good. There is quite a bit of code to deal with the caching and lookup, but I don’t see an existing alternative implementation in the JDK that could be reused or moulded to fit this particular use case.

I experimented a little with spinning a class to hold the transformed MH in the constant pool, and accessing through a SAM type, just to see it if had any positive effect on the benchmark numbers - it did not.

-Chris.


> On 21 Jun 2020, at 18:16, Peter Levart <peter.levart at gmail.com> wrote:
> 
> Hi,
> 
> 
> 
> When re-running the benchmark [1] with different lengths of serialized arrays of records, I found that, compared to classical classes, lookup into the cache of adapted method handles starts to show when the length of array is larger (# of instances of same record type deserialized in single stream). Each record deserialized must lookup the method handle in a ConcurrentHashMap:
> 
> 
> 
> Benchmark                                    (length)  Mode  Cnt    Score   Error  Units
> RecordSerializationBench.deserializeClasses        10  avgt   10    8.088 ± 0.013  us/op
> RecordSerializationBench.deserializeClasses       100  avgt   10   32.171 ± 0.324  us/op
> RecordSerializationBench.deserializeClasses      1000  avgt   10  279.762 ± 3.072  us/op
> RecordSerializationBench.deserializeRecords        10  avgt   10    9.011 ± 0.027  us/op
> RecordSerializationBench.deserializeRecords       100  avgt   10   33.206 ± 0.514  us/op
> RecordSerializationBench.deserializeRecords      1000  avgt   10  325.137 ± 0.969  us/op
> 
> 
> ...so keeping the correctly shaped adapted method handle in the per-serialization-session ObjectStreamClass instance [2] starts to make sense:
> 
> 
> 
> Benchmark                                    (length)  Mode  Cnt    Score   Error  Units
> RecordSerializationBench.deserializeClasses        10  avgt   10    8.681 ± 0.155  us/op
> RecordSerializationBench.deserializeClasses       100  avgt   10   32.496 ± 0.087  us/op
> RecordSerializationBench.deserializeClasses      1000  avgt   10  279.014 ± 1.189  us/op
> RecordSerializationBench.deserializeRecords        10  avgt   10    8.537 ± 0.032  us/op
> RecordSerializationBench.deserializeRecords       100  avgt   10   31.451 ± 0.083  us/op
> RecordSerializationBench.deserializeRecords      1000  avgt   10  250.854 ± 2.772  us/op
> 
> 
> With that, more objects means advantage over classical classes instead of disadvantage.
> 
> 
> 
> [1] http://cr.openjdk.java.net/~plevart/jdk-dev/RecordsDeserialization/RecordSerializationBench.java <http://cr.openjdk.java.net/~plevart/jdk-dev/RecordsDeserialization/RecordSerializationBench.java>
> [2] http://cr.openjdk.java.net/~plevart/jdk-dev/RecordsDeserialization/webrev.06/ <http://cr.openjdk.java.net/~plevart/jdk-dev/RecordsDeserialization/webrev.06/>
> 
> Regards, Peter
> 
> 
> 



More information about the core-libs-dev mailing list