RFR: 8247532: Records deserialization is slow

Claes Redestad claes.redestad at oracle.com
Sun Jun 21 23:04:59 UTC 2020


Hi Peter,

patch and results look great!

My only real comment on this is that I think the microbenchmark would be
a valuable contribution, too.

It'd also be interesting to explore how poor performance would become if
we'd hit the (artificial) 11 layouts limit, e.g, by cycling through
10, 11, or 12 different shapes.

/Claes

On 2020-06-21 19:16, Peter Levart 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 
> 
> 
> [2] 
> http://cr.openjdk.java.net/~plevart/jdk-dev/RecordsDeserialization/webrev.06/ 
> 
> 
> 
> Regards, Peter
> 
> 


More information about the core-libs-dev mailing list