[ 
https://issues.apache.org/jira/browse/EMAIL-193?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17120440#comment-17120440
 ] 

JIN XU commented on EMAIL-193:
------------------------------

Sorry this is a misoperation.

this bug shall be commited to commons-BeanUtils not commons-Email.

close it.

> use ConcurrentHashMap insteadof WeakHashMap
> -------------------------------------------
>
>                 Key: EMAIL-193
>                 URL: https://issues.apache.org/jira/browse/EMAIL-193
>             Project: Commons Email
>          Issue Type: Improvement
>         Environment: win10, jdk8
>            Reporter: JIN XU
>            Priority: Minor
>
> Hi.
> throughtout my performance test (using Jprofiler), I found out WeakHashMap is 
> far slower than ConcurrentHashMap.
> Should we use ConcurrentHashMap instead of WeakHashMap?
> I will attach my test codes here.
> {code:java}
> /*
>  * Licensed to the Apache Software Foundation (ASF) under one or more
>  * contributor license agreements.  See the NOTICE file distributed with
>  * this work for additional information regarding copyright ownership.
>  * The ASF licenses this file to You under the Apache License, Version 2.0
>  * (the "License"); you may not use this file except in compliance with
>  * the License.  You may obtain a copy of the License at
>  *
>  *      http://www.apache.org/licenses/LICENSE-2.0
>  *
>  * Unless required by applicable law or agreed to in writing, software
>  * distributed under the License is distributed on an "AS IS" BASIS,
>  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
>  * See the License for the specific language governing permissions and
>  * limitations under the License.
>  */import org.apache.commons.beanutils2.WeakFastHashMap;import 
> java.util.Objects;
> import java.util.Random;
> import java.util.TreeSet;
> import java.util.concurrent.ConcurrentHashMap;public class 
> WeakFastHashMapTest {
>     static final TreeSet<Integer> treeSet = new TreeSet<>();
>     static final Random random = new Random();
>     static final WeakFastHashMap<Integer, Integer> weakFastHashMap = new 
> WeakFastHashMap<>();
>     static final ConcurrentHashMap<Integer, Integer> concurrentHashMap = new 
> ConcurrentHashMap<>();    static final int INIT_SIZE = 50000;
>     static final double WRITE_CHANCE = 0.01;
>     static final double READ_NON_EXIST_CHANCE = 0.30;    public static void 
> main(String[] args) {
>         for (int i = 0; i < INIT_SIZE; i++) {
>             writeRandom();
>         }
>         System.out.println("init over");        
> weakFastHashMap.setFast(true);        for (int i = 0; ; i++) {
>             if (i % 100000 == 0) {
>                 System.out.println("running> i : " + i + " size: " + 
> treeSet.size());
>             }
>             double ifWrite = random.nextDouble();
>             if (ifWrite < WRITE_CHANCE) {
>                 writeRandom();
>             } else {
>                 double ifNonExist = random.nextDouble();
>                 if (ifNonExist < READ_NON_EXIST_CHANCE) {
>                     readNonExist();
>                 } else {
>                     readExist();
>                 }
>             }
>         }
>     }    public static void writeRandom() {
>         Integer nowKey = random.nextInt() * random.nextInt();
>         Integer nowValue = random.nextInt() * random.nextInt();
>         treeSet.add(nowKey);
>         weakFastHashMap.put(nowKey, nowValue);
>         concurrentHashMap.put(nowKey, nowValue);
>     }    public static void readExist() {
>         Integer nowKey = null;
>         while (nowKey == null) {
>             nowKey = treeSet.lower(random.nextInt() * random.nextInt());
>         }
>         read(nowKey);
>     }    public static void readNonExist() {
>         Integer nowKey = random.nextInt() * random.nextInt();
>         while (treeSet.contains(nowKey)) {
>             nowKey = random.nextInt() * random.nextInt();
>         }
>         read(nowKey);
>     }    public static void read(Integer nowKey) {
>         Integer value1 = weakFastHashMap.get(nowKey);
>         Integer value2 = concurrentHashMap.get(nowKey);
>         if (!Objects.equals(value1, value2)) {
>             System.out.println("not equal!  nowKey : " + nowKey + " value1 : 
> " + value1 + " value2 : " + value2);
>         }
>     }
> }
> {code}
> and, Jprofiler Call Tree:
> h2. Call Tree
> |*Session:*|WeakFastHashMapTest|
> |*Time of export:*|Sunday, May 31, 2020 2:56:14 PM CST|
> |*JVM time:*|12:23|
> | | |
> |*View mode:* |Tree|
> |*Thread selection:* |<img "height="16" width="16" border="0" hspace="0" 
> vspace="0" src=" jprofiler_images/selector_group_16.png"> All thread groups|
> |*Thread status:* |<img "height="6" width="16" border="0" hspace="0" 
> vspace="0" src=" jprofiler_images/ff00c400_bff000000.png"> Runnable|
> |*Aggregation level:* |Methods|
> ----
>  
> |!jprofiler_images/tree/menu_tee_minus_18.gif|width=18,height=18,align=left!!jprofiler_images/call_method_16_filter_underlay_16.png|width=16,height=16,align=left!
>    
> !jprofiler_images/pixel_ff990000.png|width=49,height=7,vspace=2!!jprofiler_images/pixel_ffff3300.png|width=1,height=7,vspace=2!
>   100.0% - 743 s - 1 inv. WeakFastHashMapTest.main|
> |!jprofiler_images/tree/menu_bar_18.gif|width=18,height=18,align=left!!jprofiler_images/tree/menu_tee_minus_18.gif|width=18,height=18,align=left!!jprofiler_images/call_method_16.png|width=16,height=16,align=left!
>    
> !jprofiler_images/pixel_ff990000.png|width=48,height=7,vspace=2!!jprofiler_images/pixel_ffff3300.png|height=7,vspace=2!
>   96.6% - 718 s - 157,464 inv. 
> org.apache.commons.beanutils2.WeakFastHashMap.put|
> |!jprofiler_images/tree/menu_bar_18.gif|width=18,height=18,align=left!!jprofiler_images/tree/menu_bar_18.gif|width=18,height=18,align=left!!jprofiler_images/tree/menu_tee_minus_18.gif|width=18,height=18,align=left!!jprofiler_images/call_method_16.png|width=16,height=16,align=left!
>    
> !jprofiler_images/pixel_ff990000.png|width=48,height=7,vspace=2!!jprofiler_images/pixel_ffff3300.png|height=7,vspace=2!
>   96.6% - 718 s - 107,464 inv. 
> org.apache.commons.beanutils2.WeakFastHashMap.cloneMap|
> |!jprofiler_images/tree/menu_bar_18.gif|width=18,height=18,align=left!!jprofiler_images/tree/menu_bar_18.gif|width=18,height=18,align=left!!jprofiler_images/tree/menu_bar_18.gif|width=18,height=18,align=left!!jprofiler_images/tree/menu_corner_minus_18.gif|width=18,height=18,align=left!!jprofiler_images/call_method_16.png|width=16,height=16,align=left!
>    
> !jprofiler_images/pixel_ff990000.png|width=48,height=7,vspace=2!!jprofiler_images/pixel_ffff3300.png|height=7,vspace=2!
>   96.6% - 718 s - 107,464 inv. 
> org.apache.commons.beanutils2.WeakFastHashMap.createMap|
> |!jprofiler_images/tree/menu_bar_18.gif|width=18,height=18,align=left!!jprofiler_images/tree/menu_bar_18.gif|width=18,height=18,align=left!!jprofiler_images/tree/menu_bar_18.gif|width=18,height=18,align=left!!jprofiler_images/tree/pixel_transparent_1.gif|width=18,height=18,align=left!!jprofiler_images/tree/menu_corner_18.gif|width=18,height=18,align=left!!jprofiler_images/call_method_16_filter_underlay_16.png|width=16,height=16,align=left!
>    !jprofiler_images/pixel_ffff3300.png|width=48,height=7,vspace=2!  96.6% - 
> 718 s - 107,464 inv. java.util.WeakHashMap.<init>|
> |!jprofiler_images/tree/menu_bar_18.gif|width=18,height=18,align=left!!jprofiler_images/tree/menu_bar_18.gif|width=18,height=18,align=left!!jprofiler_images/tree/menu_corner_18.gif|width=18,height=18,align=left!!jprofiler_images/call_method_16_filter_underlay_16.png|width=16,height=16,align=left!
>    !jprofiler_images/pixel_ffff3300.png|height=7,vspace=2!  0.0% - 80,342 µs 
> - 157,463 inv. java.util.Map.put|
> |!jprofiler_images/tree/menu_bar_18.gif|width=18,height=18,align=left!!jprofiler_images/tree/menu_tee_minus_18.gif|width=18,height=18,align=left!!jprofiler_images/call_method_16.png|width=16,height=16,align=left!
>    !jprofiler_images/pixel_ffff3300.png|height=7,vspace=2!  0.5% - 3,625 ms - 
> 10,654,869 inv. org.apache.commons.beanutils2.WeakFastHashMap.get|
> |!jprofiler_images/tree/menu_bar_18.gif|width=18,height=18,align=left!!jprofiler_images/tree/menu_bar_18.gif|width=18,height=18,align=left!!jprofiler_images/tree/menu_corner_18.gif|width=18,height=18,align=left!!jprofiler_images/call_method_16_filter_underlay_16.png|width=16,height=16,align=left!
>    !jprofiler_images/pixel_ffff3300.png|height=7,vspace=2!  0.3% - 2,263 ms - 
> 10,654,869 inv. java.util.Map.get|
> |!jprofiler_images/tree/menu_bar_18.gif|width=18,height=18,align=left!!jprofiler_images/tree/menu_corner_18.gif|width=18,height=18,align=left!!jprofiler_images/call_method_16.png|width=16,height=16,align=left!
>    !jprofiler_images/pixel_ffff3300.png|height=7,vspace=2!  0.0% - 1 µs - 1 
> inv. org.apache.commons.beanutils2.WeakFastHashMap.setFast|
> |!jprofiler_images/tree/menu_corner_minus_18.gif|width=18,height=18,align=left!!jprofiler_images/call_method_16_filter_underlay_16.png|width=16,height=16,align=left!
>    !jprofiler_images/pixel_ffff3300.png|height=7,vspace=2!  0.0% - 2,776 µs - 
> 1 inv. WeakFastHashMapTest.<clinit>|
> |!jprofiler_images/tree/pixel_transparent_1.gif|width=18,height=18,align=left!!jprofiler_images/tree/menu_corner_minus_18.gif|width=18,height=18,align=left!!jprofiler_images/call_method_16.png|width=16,height=16,align=left!
>    !jprofiler_images/pixel_ffff3300.png|height=7,vspace=2!  0.0% - 51 µs - 1 
> inv. org.apache.commons.beanutils2.WeakFastHashMap.<init>|
> |!jprofiler_images/tree/pixel_transparent_1.gif|width=18,height=18,align=left!!jprofiler_images/tree/pixel_transparent_1.gif|width=18,height=18,align=left!!jprofiler_images/tree/menu_tee_minus_18.gif|width=18,height=18,align=left!!jprofiler_images/call_method_16.png|width=16,height=16,align=left!
>    !jprofiler_images/pixel_ffff3300.png|height=7,vspace=2!  0.0% - 36 µs - 1 
> inv. org.apache.commons.beanutils2.WeakFastHashMap.createMap|
> |!jprofiler_images/tree/pixel_transparent_1.gif|width=18,height=18,align=left!!jprofiler_images/tree/pixel_transparent_1.gif|width=18,height=18,align=left!!jprofiler_images/tree/menu_bar_18.gif|width=18,height=18,align=left!!jprofiler_images/tree/menu_corner_18.gif|width=18,height=18,align=left!!jprofiler_images/call_method_16_filter_underlay_16.png|width=16,height=16,align=left!
>    !jprofiler_images/pixel_ffff3300.png|height=7,vspace=2!  0.0% - 7 µs - 1 
> inv. java.util.WeakHashMap.<init>|
> |!jprofiler_images/tree/pixel_transparent_1.gif|width=18,height=18,align=left!!jprofiler_images/tree/pixel_transparent_1.gif|width=18,height=18,align=left!!jprofiler_images/tree/menu_corner_18.gif|width=18,height=18,align=left!!jprofiler_images/call_method_16_filter_underlay_16.png|width=16,height=16,align=left!
>    !jprofiler_images/pixel_ffff3300.png|height=7,vspace=2!  0.0% - 3 µs - 1 
> inv. java.util.HashMap.<init>|
>  
> 96.6% of the total running time is at WeakHashMap.put
> And notice that only 1/100 chance we write, other 99/100 chance we read.
> If you want the data about 1/1000 or other, I will be happy to run/provide.
>  



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to