Re: RFR: 8247532, 8248135: Records deserialization is slow + Build microbenchmarks with --enable-preview

2020-06-23 Thread Peter Levart



On 6/23/20 2:47 PM, Chris Hegarty wrote:



On 23 Jun 2020, at 10:46, Chris Hegarty  wrote:




On 23 Jun 2020, at 10:17, Peter Levart  wrote:

...
http://cr.openjdk.java.net/~plevart/jdk-dev/RecordsDeserialization/webrev.08/

Good stuff. Reviewed.

I am going to take this latest change and run it through our internal build and 
test system. Will post the results here soon.

All clear - builds and tests with this change are green.

-Chris.


Ok, I'm going to push this to jdk15.


Thanks Johannes, Chris, Remi, Paul, Claes and Magnus, for the help and 
reviews.



Regards, Peter




Re: RFR: 8247532, 8248135: Records deserialization is slow + Build microbenchmarks with --enable-preview

2020-06-23 Thread Chris Hegarty



> On 23 Jun 2020, at 10:46, Chris Hegarty  wrote:
> 
> 
> 
>> On 23 Jun 2020, at 10:17, Peter Levart  wrote:
>> 
>> ...
>> http://cr.openjdk.java.net/~plevart/jdk-dev/RecordsDeserialization/webrev.08/
> 
> Good stuff. Reviewed.
> 
> I am going to take this latest change and run it through our internal build 
> and test system. Will post the results here soon.

All clear - builds and tests with this change are green.

-Chris.



Re: RFR: 8247532, 8248135: Records deserialization is slow + Build microbenchmarks with --enable-preview

2020-06-23 Thread Chris Hegarty



> On 23 Jun 2020, at 10:17, Peter Levart  wrote:
> 
> ...
> http://cr.openjdk.java.net/~plevart/jdk-dev/RecordsDeserialization/webrev.08/

Good stuff. Reviewed.

I am going to take this latest change and run it through our internal build and 
test system. Will post the results here soon.

-Chris.




Re: RFR: 8247532, 8248135: Records deserialization is slow + Build microbenchmarks with --enable-preview

2020-06-23 Thread Claes Redestad

Looks good to me!

/Claes

On 2020-06-23 11:17, Peter Levart wrote:

Including build-dev since this patch is adding new issue 8248135:


https://bugs.openjdk.java.net/browse/JDK-8248135


So here's new webrev with a patch for building benchmarks with 
--enable-preview included:



http://cr.openjdk.java.net/~plevart/jdk-dev/RecordsDeserialization/webrev.08/ 




Regards, Peter


On 6/23/20 10:23 AM, Claes Redestad wrote:



On 2020-06-23 10:06, Claes Redestad wrote:

Hi,

On 2020-06-23 09:49, Peter Levart wrote:

Hi Chris, Claes,


Ok then, here's with benchmark included:


http://cr.openjdk.java.net/~plevart/jdk-dev/RecordsDeserialization/webrev.07/ 




I haven't been able to run the benchmark with "make test" though. I 
have tried various ways to pass javac options to build like:



make test 
TEST='micro:org.openjdk.bench.java.io.RecordDeserialization' 
TEST_OPTS="VM_OPTIONS=--enable-preview --release=16"



...but javac doesn't seem to get them. Is there some secret option 
to achieve that?


Hmm, we might as well have the microbenchmarks build with
--enable-preview on by default. Try this:


Fixed:

diff -r f2e1cd498381 make/test/BuildMicrobenchmark.gmk
--- a/make/test/BuildMicrobenchmark.gmk Tue Jun 23 10:08:35 2020 +0200
+++ b/make/test/BuildMicrobenchmark.gmk Tue Jun 23 10:33:17 2020 +0200
@@ -90,10 +90,11 @@
 TARGET_RELEASE := $(TARGET_RELEASE_NEWJDK_UPGRADED), \
 SMALL_JAVA := false, \
 CLASSPATH := $(MICROBENCHMARK_CLASSPATH), \
-    DISABLED_WARNINGS := processing rawtypes cast serial, \
+    DISABLED_WARNINGS := processing rawtypes cast serial preview, \
 SRC := $(MICROBENCHMARK_SRC), \
 BIN := $(MICROBENCHMARK_CLASSES), \
 JAVA_FLAGS := --add-modules jdk.unsupported --limit-modules 
java.management, \

+    JAVAC_FLAGS := --enable-preview, \
 ))

 $(BUILD_JDK_MICROBENCHMARK): $(JMH_COMPILE_JARS)

I verified this works with your micro, and doesn't seem to cause
any issues elsewhere:

 make test TEST=micro:RecordDeserialization

I can shepherd this as a separate fix for documentation purposes, but
feel free to include it in your patch and ping build-dev@..

/Claes



diff -r 52741f85bf23 make/test/BuildMicrobenchmark.gmk
--- a/make/test/BuildMicrobenchmark.gmk    Tue Jun 23 09:54:42 2020 
+0200
+++ b/make/test/BuildMicrobenchmark.gmk    Tue Jun 23 09:59:29 2020 
+0200

@@ -93,7 +93,7 @@
  DISABLED_WARNINGS := processing rawtypes cast serial, \
  SRC := $(MICROBENCHMARK_SRC), \
  BIN := $(MICROBENCHMARK_CLASSES), \
-    JAVA_FLAGS := --add-modules jdk.unsupported --limit-modules 
java.management, \
+    JAVA_FLAGS := --enable-preview --add-modules jdk.unsupported 
--limit-modules java.management, \

  ))

  $(BUILD_JDK_MICROBENCHMARK): $(JMH_COMPILE_JARS)




Otherwise, I simulated what would happen when there are more then 10 
ObjectStreamClass layouts for same class rapidly interchanging, so 
that they push each other out of the cache, by temporarily setting 
cache's MAX_SIZE = 0. Note that this is worst case scenario:



Benchmark  (length)  Mode Cnt 
Score    Error  Units
RecordDeserializationBench.deserializeClasses    10 avgt   10 
9.393 ±  0.287  us/op
RecordDeserializationBench.deserializeClasses   100 avgt   10 
35.642 ±  0.977  us/op
RecordDeserializationBench.deserializeClasses  1000 avgt   10 
293.769 ±  7.321  us/op
RecordDeserializationBench.deserializeRecords    10 avgt   10 
15.335 ±  0.496  us/op
RecordDeserializationBench.deserializeRecords   100 avgt   10 
211.427 ± 11.908  us/op
RecordDeserializationBench.deserializeRecords  1000 avgt   10 
990.398 ± 26.681  us/op



This is using JMH option '-gc true' to force GC after each iteration 
of benchmark. Without it, I get a big (~4s) full-GC pause just in 
the middle of a run with length=100:



Iteration   1: 528.577 us/op
Iteration   2: 580.404 us/op
Iteration   3: 4438.228 us/op
Iteration   4: 644.532 us/op
Iteration   5: 698.493 us/op
Iteration   6: 800.738 us/op
Iteration   7: 929.791 us/op
Iteration   8: 870.946 us/op
Iteration   9: 863.416 us/op
Iteration  10: 916.508 us/op


...so results are a bit off because of that:


Benchmark  (length)  Mode 
Cnt Score  Error  Units
RecordDeserializationBench.deserializeClasses    10 avgt 10 
8.263 ±    0.043  us/op
RecordDeserializationBench.deserializeClasses   100 avgt   10 
33.406 ±    0.160  us/op
RecordDeserializationBench.deserializeClasses  1000 avgt   10 
287.595 ±    0.960  us/op
RecordDeserializationBench.deserializeRecords    10 avgt   10 
15.270 ±    0.080  us/op
RecordDeserializationBench.deserializeRecords   100 avgt   10 
1127.163 ± 1771.892  us/op
RecordDeserializationBench.deserializeRecords  1000 avgt   10 
2003.235 ±  227.159  us/op



Yes, there is quite a bit of GCing going on when cache is thrashing. 
Note that I haven't tuned GC in any way and I'm running this on a 
machine with 64GiB of RAM 

Re: RFR: 8247532, 8248135: Records deserialization is slow + Build microbenchmarks with --enable-preview

2020-06-23 Thread Peter Levart

Thanks, Magnus.

Peter

On 6/23/20 11:27 AM, Magnus Ihse Bursie wrote:



On 2020-06-23 11:17, Peter Levart wrote:

Including build-dev since this patch is adding new issue 8248135:


https://bugs.openjdk.java.net/browse/JDK-8248135


So here's new webrev with a patch for building benchmarks with 
--enable-preview included:



http://cr.openjdk.java.net/~plevart/jdk-dev/RecordsDeserialization/webrev.08/ 


Build changes look good.

/Magnus



Regards, Peter


On 6/23/20 10:23 AM, Claes Redestad wrote:



On 2020-06-23 10:06, Claes Redestad wrote:

Hi,

On 2020-06-23 09:49, Peter Levart wrote:

Hi Chris, Claes,


Ok then, here's with benchmark included:


http://cr.openjdk.java.net/~plevart/jdk-dev/RecordsDeserialization/webrev.07/ 




I haven't been able to run the benchmark with "make test" though. 
I have tried various ways to pass javac options to build like:



make test 
TEST='micro:org.openjdk.bench.java.io.RecordDeserialization' 
TEST_OPTS="VM_OPTIONS=--enable-preview --release=16"



...but javac doesn't seem to get them. Is there some secret option 
to achieve that?


Hmm, we might as well have the microbenchmarks build with
--enable-preview on by default. Try this:


Fixed:

diff -r f2e1cd498381 make/test/BuildMicrobenchmark.gmk
--- a/make/test/BuildMicrobenchmark.gmk Tue Jun 23 10:08:35 2020 +0200
+++ b/make/test/BuildMicrobenchmark.gmk Tue Jun 23 10:33:17 2020 +0200
@@ -90,10 +90,11 @@
 TARGET_RELEASE := $(TARGET_RELEASE_NEWJDK_UPGRADED), \
 SMALL_JAVA := false, \
 CLASSPATH := $(MICROBENCHMARK_CLASSPATH), \
-    DISABLED_WARNINGS := processing rawtypes cast serial, \
+    DISABLED_WARNINGS := processing rawtypes cast serial preview, \
 SRC := $(MICROBENCHMARK_SRC), \
 BIN := $(MICROBENCHMARK_CLASSES), \
 JAVA_FLAGS := --add-modules jdk.unsupported --limit-modules 
java.management, \

+    JAVAC_FLAGS := --enable-preview, \
 ))

 $(BUILD_JDK_MICROBENCHMARK): $(JMH_COMPILE_JARS)

I verified this works with your micro, and doesn't seem to cause
any issues elsewhere:

 make test TEST=micro:RecordDeserialization

I can shepherd this as a separate fix for documentation purposes, but
feel free to include it in your patch and ping build-dev@..

/Claes



diff -r 52741f85bf23 make/test/BuildMicrobenchmark.gmk
--- a/make/test/BuildMicrobenchmark.gmk    Tue Jun 23 09:54:42 2020 
+0200
+++ b/make/test/BuildMicrobenchmark.gmk    Tue Jun 23 09:59:29 2020 
+0200

@@ -93,7 +93,7 @@
  DISABLED_WARNINGS := processing rawtypes cast serial, \
  SRC := $(MICROBENCHMARK_SRC), \
  BIN := $(MICROBENCHMARK_CLASSES), \
-    JAVA_FLAGS := --add-modules jdk.unsupported --limit-modules 
java.management, \
+    JAVA_FLAGS := --enable-preview --add-modules jdk.unsupported 
--limit-modules java.management, \

  ))

  $(BUILD_JDK_MICROBENCHMARK): $(JMH_COMPILE_JARS)




Otherwise, I simulated what would happen when there are more then 
10 ObjectStreamClass layouts for same class rapidly interchanging, 
so that they push each other out of the cache, by temporarily 
setting cache's MAX_SIZE = 0. Note that this is worst case scenario:



Benchmark  (length) Mode 
Cnt    Score    Error  Units
RecordDeserializationBench.deserializeClasses    10 avgt   
10    9.393 ±  0.287  us/op
RecordDeserializationBench.deserializeClasses   100 avgt   
10   35.642 ±  0.977  us/op
RecordDeserializationBench.deserializeClasses  1000 avgt   10  
293.769 ±  7.321  us/op
RecordDeserializationBench.deserializeRecords    10 avgt   
10   15.335 ±  0.496  us/op
RecordDeserializationBench.deserializeRecords   100 avgt   10  
211.427 ± 11.908  us/op
RecordDeserializationBench.deserializeRecords  1000 avgt   10  
990.398 ± 26.681  us/op



This is using JMH option '-gc true' to force GC after each 
iteration of benchmark. Without it, I get a big (~4s) full-GC 
pause just in the middle of a run with length=100:



Iteration   1: 528.577 us/op
Iteration   2: 580.404 us/op
Iteration   3: 4438.228 us/op
Iteration   4: 644.532 us/op
Iteration   5: 698.493 us/op
Iteration   6: 800.738 us/op
Iteration   7: 929.791 us/op
Iteration   8: 870.946 us/op
Iteration   9: 863.416 us/op
Iteration  10: 916.508 us/op


...so results are a bit off because of that:


Benchmark  (length) Mode 
Cnt Score  Error  Units
RecordDeserializationBench.deserializeClasses    10 avgt   
10 8.263 ±    0.043  us/op
RecordDeserializationBench.deserializeClasses   100 avgt   
10    33.406 ±    0.160  us/op
RecordDeserializationBench.deserializeClasses  1000 avgt   
10   287.595 ±    0.960  us/op
RecordDeserializationBench.deserializeRecords    10 avgt   
10    15.270 ±    0.080  us/op
RecordDeserializationBench.deserializeRecords   100 avgt   10  
1127.163 ± 1771.892  us/op
RecordDeserializationBench.deserializeRecords  1000 avgt   10  
2003.235 ±  227.159  us/op



Yes, there is quite a bit of GCing going on when cache is 

Re: RFR: 8247532, 8248135: Records deserialization is slow + Build microbenchmarks with --enable-preview

2020-06-23 Thread Magnus Ihse Bursie




On 2020-06-23 11:17, Peter Levart wrote:

Including build-dev since this patch is adding new issue 8248135:


https://bugs.openjdk.java.net/browse/JDK-8248135


So here's new webrev with a patch for building benchmarks with 
--enable-preview included:



http://cr.openjdk.java.net/~plevart/jdk-dev/RecordsDeserialization/webrev.08/ 


Build changes look good.

/Magnus



Regards, Peter


On 6/23/20 10:23 AM, Claes Redestad wrote:



On 2020-06-23 10:06, Claes Redestad wrote:

Hi,

On 2020-06-23 09:49, Peter Levart wrote:

Hi Chris, Claes,


Ok then, here's with benchmark included:


http://cr.openjdk.java.net/~plevart/jdk-dev/RecordsDeserialization/webrev.07/ 




I haven't been able to run the benchmark with "make test" though. I 
have tried various ways to pass javac options to build like:



make test 
TEST='micro:org.openjdk.bench.java.io.RecordDeserialization' 
TEST_OPTS="VM_OPTIONS=--enable-preview --release=16"



...but javac doesn't seem to get them. Is there some secret option 
to achieve that?


Hmm, we might as well have the microbenchmarks build with
--enable-preview on by default. Try this:


Fixed:

diff -r f2e1cd498381 make/test/BuildMicrobenchmark.gmk
--- a/make/test/BuildMicrobenchmark.gmk Tue Jun 23 10:08:35 2020 +0200
+++ b/make/test/BuildMicrobenchmark.gmk Tue Jun 23 10:33:17 2020 +0200
@@ -90,10 +90,11 @@
 TARGET_RELEASE := $(TARGET_RELEASE_NEWJDK_UPGRADED), \
 SMALL_JAVA := false, \
 CLASSPATH := $(MICROBENCHMARK_CLASSPATH), \
-    DISABLED_WARNINGS := processing rawtypes cast serial, \
+    DISABLED_WARNINGS := processing rawtypes cast serial preview, \
 SRC := $(MICROBENCHMARK_SRC), \
 BIN := $(MICROBENCHMARK_CLASSES), \
 JAVA_FLAGS := --add-modules jdk.unsupported --limit-modules 
java.management, \

+    JAVAC_FLAGS := --enable-preview, \
 ))

 $(BUILD_JDK_MICROBENCHMARK): $(JMH_COMPILE_JARS)

I verified this works with your micro, and doesn't seem to cause
any issues elsewhere:

 make test TEST=micro:RecordDeserialization

I can shepherd this as a separate fix for documentation purposes, but
feel free to include it in your patch and ping build-dev@..

/Claes



diff -r 52741f85bf23 make/test/BuildMicrobenchmark.gmk
--- a/make/test/BuildMicrobenchmark.gmk    Tue Jun 23 09:54:42 2020 
+0200
+++ b/make/test/BuildMicrobenchmark.gmk    Tue Jun 23 09:59:29 2020 
+0200

@@ -93,7 +93,7 @@
  DISABLED_WARNINGS := processing rawtypes cast serial, \
  SRC := $(MICROBENCHMARK_SRC), \
  BIN := $(MICROBENCHMARK_CLASSES), \
-    JAVA_FLAGS := --add-modules jdk.unsupported --limit-modules 
java.management, \
+    JAVA_FLAGS := --enable-preview --add-modules jdk.unsupported 
--limit-modules java.management, \

  ))

  $(BUILD_JDK_MICROBENCHMARK): $(JMH_COMPILE_JARS)




Otherwise, I simulated what would happen when there are more then 
10 ObjectStreamClass layouts for same class rapidly interchanging, 
so that they push each other out of the cache, by temporarily 
setting cache's MAX_SIZE = 0. Note that this is worst case scenario:



Benchmark  (length) Mode Cnt    
Score    Error  Units
RecordDeserializationBench.deserializeClasses    10 avgt   
10    9.393 ±  0.287  us/op
RecordDeserializationBench.deserializeClasses   100 avgt   10   
35.642 ±  0.977  us/op
RecordDeserializationBench.deserializeClasses  1000 avgt   10  
293.769 ±  7.321  us/op
RecordDeserializationBench.deserializeRecords    10 avgt   10   
15.335 ±  0.496  us/op
RecordDeserializationBench.deserializeRecords   100 avgt   10  
211.427 ± 11.908  us/op
RecordDeserializationBench.deserializeRecords  1000 avgt   10  
990.398 ± 26.681  us/op



This is using JMH option '-gc true' to force GC after each 
iteration of benchmark. Without it, I get a big (~4s) full-GC pause 
just in the middle of a run with length=100:



Iteration   1: 528.577 us/op
Iteration   2: 580.404 us/op
Iteration   3: 4438.228 us/op
Iteration   4: 644.532 us/op
Iteration   5: 698.493 us/op
Iteration   6: 800.738 us/op
Iteration   7: 929.791 us/op
Iteration   8: 870.946 us/op
Iteration   9: 863.416 us/op
Iteration  10: 916.508 us/op


...so results are a bit off because of that:


Benchmark  (length) Mode 
Cnt Score  Error  Units
RecordDeserializationBench.deserializeClasses    10 avgt   
10 8.263 ±    0.043  us/op
RecordDeserializationBench.deserializeClasses   100 avgt   
10    33.406 ±    0.160  us/op
RecordDeserializationBench.deserializeClasses  1000 avgt   10   
287.595 ±    0.960  us/op
RecordDeserializationBench.deserializeRecords    10 avgt   
10    15.270 ±    0.080  us/op
RecordDeserializationBench.deserializeRecords   100 avgt   10  
1127.163 ± 1771.892  us/op
RecordDeserializationBench.deserializeRecords  1000 avgt   10  
2003.235 ±  227.159  us/op



Yes, there is quite a bit of GCing going on when cache is 
thrashing. Note that I haven't tuned GC in any way and I'm running 

Re: RFR: 8247532, 8248135: Records deserialization is slow + Build microbenchmarks with --enable-preview

2020-06-23 Thread Peter Levart

Including build-dev since this patch is adding new issue 8248135:


https://bugs.openjdk.java.net/browse/JDK-8248135


So here's new webrev with a patch for building benchmarks with 
--enable-preview included:



http://cr.openjdk.java.net/~plevart/jdk-dev/RecordsDeserialization/webrev.08/


Regards, Peter


On 6/23/20 10:23 AM, Claes Redestad wrote:



On 2020-06-23 10:06, Claes Redestad wrote:

Hi,

On 2020-06-23 09:49, Peter Levart wrote:

Hi Chris, Claes,


Ok then, here's with benchmark included:


http://cr.openjdk.java.net/~plevart/jdk-dev/RecordsDeserialization/webrev.07/ 




I haven't been able to run the benchmark with "make test" though. I 
have tried various ways to pass javac options to build like:



make test 
TEST='micro:org.openjdk.bench.java.io.RecordDeserialization' 
TEST_OPTS="VM_OPTIONS=--enable-preview --release=16"



...but javac doesn't seem to get them. Is there some secret option 
to achieve that?


Hmm, we might as well have the microbenchmarks build with
--enable-preview on by default. Try this:


Fixed:

diff -r f2e1cd498381 make/test/BuildMicrobenchmark.gmk
--- a/make/test/BuildMicrobenchmark.gmk Tue Jun 23 10:08:35 2020 +0200
+++ b/make/test/BuildMicrobenchmark.gmk Tue Jun 23 10:33:17 2020 +0200
@@ -90,10 +90,11 @@
 TARGET_RELEASE := $(TARGET_RELEASE_NEWJDK_UPGRADED), \
 SMALL_JAVA := false, \
 CLASSPATH := $(MICROBENCHMARK_CLASSPATH), \
-    DISABLED_WARNINGS := processing rawtypes cast serial, \
+    DISABLED_WARNINGS := processing rawtypes cast serial preview, \
 SRC := $(MICROBENCHMARK_SRC), \
 BIN := $(MICROBENCHMARK_CLASSES), \
 JAVA_FLAGS := --add-modules jdk.unsupported --limit-modules 
java.management, \

+    JAVAC_FLAGS := --enable-preview, \
 ))

 $(BUILD_JDK_MICROBENCHMARK): $(JMH_COMPILE_JARS)

I verified this works with your micro, and doesn't seem to cause
any issues elsewhere:

 make test TEST=micro:RecordDeserialization

I can shepherd this as a separate fix for documentation purposes, but
feel free to include it in your patch and ping build-dev@..

/Claes



diff -r 52741f85bf23 make/test/BuildMicrobenchmark.gmk
--- a/make/test/BuildMicrobenchmark.gmk    Tue Jun 23 09:54:42 2020 
+0200
+++ b/make/test/BuildMicrobenchmark.gmk    Tue Jun 23 09:59:29 2020 
+0200

@@ -93,7 +93,7 @@
  DISABLED_WARNINGS := processing rawtypes cast serial, \
  SRC := $(MICROBENCHMARK_SRC), \
  BIN := $(MICROBENCHMARK_CLASSES), \
-    JAVA_FLAGS := --add-modules jdk.unsupported --limit-modules 
java.management, \
+    JAVA_FLAGS := --enable-preview --add-modules jdk.unsupported 
--limit-modules java.management, \

  ))

  $(BUILD_JDK_MICROBENCHMARK): $(JMH_COMPILE_JARS)




Otherwise, I simulated what would happen when there are more then 10 
ObjectStreamClass layouts for same class rapidly interchanging, so 
that they push each other out of the cache, by temporarily setting 
cache's MAX_SIZE = 0. Note that this is worst case scenario:



Benchmark  (length)  Mode Cnt    
Score    Error  Units
RecordDeserializationBench.deserializeClasses    10 avgt   10    
9.393 ±  0.287  us/op
RecordDeserializationBench.deserializeClasses   100 avgt   10   
35.642 ±  0.977  us/op
RecordDeserializationBench.deserializeClasses  1000 avgt   10  
293.769 ±  7.321  us/op
RecordDeserializationBench.deserializeRecords    10 avgt   10   
15.335 ±  0.496  us/op
RecordDeserializationBench.deserializeRecords   100 avgt   10  
211.427 ± 11.908  us/op
RecordDeserializationBench.deserializeRecords  1000 avgt   10  
990.398 ± 26.681  us/op



This is using JMH option '-gc true' to force GC after each iteration 
of benchmark. Without it, I get a big (~4s) full-GC pause just in 
the middle of a run with length=100:



Iteration   1: 528.577 us/op
Iteration   2: 580.404 us/op
Iteration   3: 4438.228 us/op
Iteration   4: 644.532 us/op
Iteration   5: 698.493 us/op
Iteration   6: 800.738 us/op
Iteration   7: 929.791 us/op
Iteration   8: 870.946 us/op
Iteration   9: 863.416 us/op
Iteration  10: 916.508 us/op


...so results are a bit off because of that:


Benchmark  (length)  Mode 
Cnt Score  Error  Units
RecordDeserializationBench.deserializeClasses    10 avgt   
10 8.263 ±    0.043  us/op
RecordDeserializationBench.deserializeClasses   100 avgt   10    
33.406 ±    0.160  us/op
RecordDeserializationBench.deserializeClasses  1000 avgt   10   
287.595 ±    0.960  us/op
RecordDeserializationBench.deserializeRecords    10 avgt   10    
15.270 ±    0.080  us/op
RecordDeserializationBench.deserializeRecords   100 avgt   10  
1127.163 ± 1771.892  us/op
RecordDeserializationBench.deserializeRecords  1000 avgt   10  
2003.235 ±  227.159  us/op



Yes, there is quite a bit of GCing going on when cache is thrashing. 
Note that I haven't tuned GC in any way and I'm running this on a 
machine with 64GiB of RAM so heap is allowed to grow quite big and 
G1 is