On Thu, 7 Sep 2023 11:13:44 GMT, Per Minborg <pminb...@openjdk.org> wrote:

> This PR outlines a solution for making immutable maps `@ValueBased` by 
> removing cacheing of certain values in `AbstractMap`.
> 
> By removing these caching fields in `AbstractMap`, we can make the immutable 
> maps `@ValueBased` and at the same time, performance is likely improved 
> because the JVM is probably able to optimize away object creation anyway via 
> escape analysis. Also, all maps will occupy less space as we get rid of a 
> number of objects and references stored for each map.
> 
> We need to benchmark this solution to better understand its implications.

@cl4es ran some benchmarks:


Name                      (size) Cnt  Base   Error   Test   Error   Unit   Diff%
HashMapViews.entrySetSize      1   5 1,085 ± 0,118  1,003 ± 0,053  ns/op    
7,6% (p = 0,002*)
  :gc.alloc.rate             N/A   5 0,013 ± 0,000  0,013 ± 0,000 MB/sec   
-0,1% (p = 0,639 )
  :gc.alloc.rate.norm        N/A   5 0,000 ± 0,000  0,000 ± 0,000   B/op   
-7,7% (p = 0,003*)
  :gc.count                  N/A   5 0,000          0,000         counts
HashMapViews.entrySetSize   1000   5 1,001 ± 0,026  1,033 ± 0,170  ns/op   
-3,3% (p = 0,173 )
  :gc.alloc.rate             N/A   5 0,013 ± 0,000  0,013 ± 0,000 MB/sec    
0,6% (p = 0,012 )
  :gc.alloc.rate.norm        N/A   5 0,000 ± 0,000  0,000 ± 0,000   B/op    
3,9% (p = 0,124 )
  :gc.count                  N/A   5 0,000          0,000         counts
HashMapViews.keySetSize        1   5 1,051 ± 0,017  0,706 ± 0,008  ns/op   
32,8% (p = 0,000*)
  :gc.alloc.rate             N/A   5 0,013 ± 0,000  0,013 ± 0,000 MB/sec    
0,0% (p = 0,947 )
  :gc.alloc.rate.norm        N/A   5 0,000 ± 0,000  0,000 ± 0,000   B/op  
-32,8% (p = 0,000*)
  :gc.count                  N/A   5 0,000          0,000         counts
HashMapViews.keySetSize     1000   5 1,078 ± 0,013  0,705 ± 0,006  ns/op   
34,6% (p = 0,000*)
  :gc.alloc.rate             N/A   5 0,013 ± 0,000  0,013 ± 0,000 MB/sec   
-0,1% (p = 0,756 )
  :gc.alloc.rate.norm        N/A   5 0,000 ± 0,000  0,000 ± 0,000   B/op  
-34,7% (p = 0,000*)
  :gc.count                  N/A   5 0,000          0,000         counts
HashMapViews.valuesSize        1   5 0,998 ± 0,033  0,718 ± 0,062  ns/op   
28,1% (p = 0,000*)
  :gc.alloc.rate             N/A   5 0,013 ± 0,000  0,013 ± 0,000 MB/sec    
0,7% (p = 0,055 )
  :gc.alloc.rate.norm        N/A   5 0,000 ± 0,000  0,000 ± 0,000   B/op  
-27,6% (p = 0,000*)
  :gc.count                  N/A   5 0,000          0,000         counts
HashMapViews.valuesSize     1000   5 1,043 ± 0,062  0,705 ± 0,011  ns/op   
32,4% (p = 0,000*)
  :gc.alloc.rate             N/A   5 0,013 ± 0,000  0,013 ± 0,000 MB/sec   
-0,3% (p = 0,405 )
  :gc.alloc.rate.norm        N/A   5 0,000 ± 0,000  0,000 ± 0,000   B/op  
-32,6% (p = 0,000*)
  :gc.count                  N/A   5 0,000          0,000         counts
  * = significant

Invariant parameters used by above microbenchmarks:
mapType:   HashMap

src/java.base/share/classes/java/util/AbstractMap.java line 323:

> 321:         return new AbstractSet<>() {
> 322:             public Iterator<K> iterator() {
> 323:                 return new Iterator<>() {

There is another PR that proposes to refactor these anonymous classes: 
https://github.com/openjdk/jdk/pull/15615/files

-------------

PR Comment: https://git.openjdk.org/jdk/pull/15614#issuecomment-1710165103
PR Review Comment: https://git.openjdk.org/jdk/pull/15614#discussion_r1329664799

Reply via email to