This looks like excellent contribution Peter!

I will proceed with the testing needed to integrate your improved 
toArray()/toArray(T[]) implementations. I have created an issue, JDK-8008167, 
for this patch.

I am surprised that this didn't get more attention back in December as it does 
seem to offer significant benefits for size and performance.

Thanks,

Mike
 
On Dec 12 2012, at 01:07 , Peter Levart wrote:

> Hi all,
> 
> I propose a patch to java.util.IdentityHashMap to speed-up toArray methods of 
> it's keySet, values and entrySet views:
> 
> http://dl.dropbox.com/u/101777488/jdk8-tl/IdentityHashMap/webrev.01/index.html
> 
> I toyed with the possibility to replace HashMap-s, that are used in 
> java.lang.Class and java.lang.reflect.[Field|Method|Constructor] to hold 
> cached annotations, with IdentityHashMap-s. They are a perfect replacement, 
> since keys in these maps are java.lang.Class objects.
> 
> They are more compact then HashMap-s. This is the comparison of allocated 
> heap bytes between HashMap and IdentityHashMap for various sizes and 
> corresponding capacities which takes into account the size of the Map object, 
> the size of allocated array and the size of Map.Entry-s in case of HM (IHM 
> doesn't have them) and the size of associated values Collection view 
> (allocated when dumping annotations to array). HM-s for annotations are 
> currently allocated with default initial capacity (16). I propose to allocate 
> IHM-s with initial capacity 8 that fits to hold 5 entries which is enough for 
> typical annotation use cases on one hand and still makes improvement for any 
> case on the other:
> 
> 32 bit JVM:
> 
>        |     HashMap     | IdentityHashMap |
>    size|capacity    bytes|capacity    bytes|IHM.bytes-HM.bytes
> --------+-----------------+-----------------+------------------
>       0|      16      144|       8      136|      -8
>       1|      16      168|       8      136|     -32
>       2|      16      192|       8      136|     -56
>       3|      16      216|       8      136|     -80
>       4|      16      240|       8      136|    -104
>       5|      16      264|       8      136|    -128
>       6|      16      288|      16      200|     -88
>       7|      16      312|      16      200|    -112
>       8|      16      336|      16      200|    -136
>       9|      16      360|      16      200|    -160
>      10|      16      384|      16      200|    -184
>      11|      16      408|      16      200|    -208
>      12|      16      432|      32      328|    -104
>      13|      32      520|      32      328|    -192
>      14|      32      544|      32      328|    -216
>      15|      32      568|      32      328|    -240
>      16|      32      592|      32      328|    -264
>      17|      32      616|      32      328|    -288
>      18|      32      640|      32      328|    -312
>      19|      32      664|      32      328|    -336
>      20|      32      688|      32      328|    -360
>      40|      64     1296|      64      584|    -712
>      60|     128     2032|     128     1096|    -936
>      80|     128     2512|     128     1096|   -1416
>     100|     256     3504|     256     2120|   -1384
>     120|     256     3984|     256     2120|   -1864
>     140|     256     4464|     256     2120|   -2344
>     160|     256     4944|     256     2120|   -2824
>     180|     256     5424|     512     4168|   -1256
> 
> 64 bit JVM:
> 
>        |     HashMap     | IdentityHashMap |
>    size|capacity    bytes|capacity    bytes|IHM.bytes-HM.bytes
> --------+-----------------+-----------------+------------------
>       0|      16      248|       8      240|      -8
>       1|      16      296|       8      240|     -56
>       2|      16      344|       8      240|    -104
>       3|      16      392|       8      240|    -152
>       4|      16      440|       8      240|    -200
>       5|      16      488|       8      240|    -248
>       6|      16      536|      16      368|    -168
>       7|      16      584|      16      368|    -216
>       8|      16      632|      16      368|    -264
>       9|      16      680|      16      368|    -312
>      10|      16      728|      16      368|    -360
>      11|      16      776|      16      368|    -408
>      12|      16      824|      32      624|    -200
>      13|      32     1000|      32      624|    -376
>      14|      32     1048|      32      624|    -424
>      15|      32     1096|      32      624|    -472
>      16|      32     1144|      32      624|    -520
>      17|      32     1192|      32      624|    -568
>      18|      32     1240|      32      624|    -616
>      19|      32     1288|      32      624|    -664
>      20|      32     1336|      32      624|    -712
>      40|      64     2552|      64     1136|   -1416
>      60|     128     4024|     128     2160|   -1864
>      80|     128     4984|     128     2160|   -2824
>     100|     256     6968|     256     4208|   -2760
>     120|     256     7928|     256     4208|   -3720
>     140|     256     8888|     256     4208|   -4680
>     160|     256     9848|     256     4208|   -5640
>     180|     256    10808|     512     8304|   -2504
> 
> I hope I've got that tables right. This is the program to compute them:
> 
> https://raw.github.com/plevart/jdk8-tl/JEP-149.2/test/src/test/IHMvsHMsizes.java
> 
> IHM is also more performant when retrieving the values by keys. The only area 
> in which it lags behind HashMap and is important for accessing annotations in 
> bulk is the toArray method of the values view. In particular for small sizes. 
> The above patch speeds-up those methods by using index iteration instead of 
> Iterator.
> 
> Here are some speed-up comparisons:
> 
> https://raw.github.com/plevart/jdk8-tl/JEP-149.2/test/IHM_benchmark_results_i7-2600K.txt
> 
> They are obtained by running the following micro benchmark:
> 
> https://raw.github.com/plevart/jdk8-tl/JEP-149.2/test/src/test/IdentityHashMapTest.java
> 
> Even if IHM doesn't replace HM for holding annotations, a speed-up 
> improvement is an improvement.
> 
> 
> Regards, Peter
> 

Reply via email to