[prev in list] [next in list] [prev in thread] [next in thread] 

List:       jakarta-commons-dev
Subject:    [jira] [Commented] (EMAIL-193) use ConcurrentHashMap insteadof WeakHashMap
From:       "JIN XU (Jira)" <jira () apache ! org>
Date:       2020-05-31 7:04:00
Message-ID: JIRA.13308544.1590908438000.139729.1590908640114 () Atlassian ! JIRA
[Download RAW message or body]


    [ 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_im \
> > ages/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_im \
> > ages/tree/menu_bar_18.gif|width=18,height=18,align=left!!jprofiler_images/tree/men \
> > u_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_im \
> > ages/tree/menu_bar_18.gif|width=18,height=18,align=left!!jprofiler_images/tree/men \
> > u_bar_18.gif|width=18,height=18,align=left!!jprofiler_images/tree/menu_corner_minu \
> > s_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_im \
> > ages/tree/menu_bar_18.gif|width=18,height=18,align=left!!jprofiler_images/tree/men \
> > u_bar_18.gif|width=18,height=18,align=left!!jprofiler_images/tree/pixel_transparen \
> > t_1.gif|width=18,height=18,align=left!!jprofiler_images/tree/menu_corner_18.gif|wi \
> > dth=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_im \
> > ages/tree/menu_bar_18.gif|width=18,height=18,align=left!!jprofiler_images/tree/men \
> > u_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_im \
> > ages/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_im \
> > ages/tree/menu_bar_18.gif|width=18,height=18,align=left!!jprofiler_images/tree/men \
> > u_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_im \
> > ages/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!!jpr \
> > ofiler_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!!jpro \
> > filer_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!!jpro \
> > filer_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!!jpro \
> > filer_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!!jpro \
> > filer_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)


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic