专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

详解关于hashmap的一些性能测试

  目录0.前言1.准备工作。1.1模拟哈希冲突1.2 java的基准测试。 2.测试初始化长度 3.模拟一百万个元素put,get的差异。 4.模拟无红黑树情况下get效率4.1 将random扩大,哈希冲突严重性大大减小,模拟大多数哈希冲突导致的哈希链长度均小于8,无法扩展为红黑树,只能遍历数组。4.1.1 ArrayList不同长度下get效率的基准测试4.2 jdk1.8版本,哈希冲突严重下的get效率测试4.3 将jdk版本降为1.7,在哈希冲突依然严重的情况下,get效率如何? 5.总结 0.前言
  本文主要讨论哈希冲突下的一些性能测试。
  为什么要写这篇文章,不是为了KPI不是为了水字数。
  hashmap是广大JAVA程序员最为耳熟能详,使用最广泛的集合框架。它是大厂面试必问,著名八股经必备。在小公司呢?这些年也面过不少人,对于3,5年以上的程序员,问到hashmap也仅限于要求知道底层是数组+链表,知道怎么放进去,知道有哈希冲突这么一回事即可,可依然免不了装备的嫌疑。
  可hashmap背后的思想,在缓存,在数据倾斜,在负载均衡等分布式大数据领域都能广泛看到其身影。了解其背后的思想不仅仅只是为了一个hashmap.
  更重要的是,hashmap不像jvm底层原理那么遥远,不像并发编程那么宏大,它只需要通勤路上十分钟就可搞定基本原理,有什么理由不呢?
  所以本文试着从相对少见的一个微小角度来重新审视一下hashmap. 1.准备工作。1.1模拟哈希冲突
  新建两个class,一个正常重写equals和hashcode方法,一个故意在hashcode方法里返回一定范围内的随机数,模拟哈希冲突,以及控制哈希冲突的程序。
  不冲突的类 @Setter public class KeyTest2 {     private String name;      @Override     public boolean equals(Object o) {         if (this == o) return true;         if (o == null || getClass() != o.getClass()) return false;          KeyTest2 keyTest = (KeyTest2) o;          return name != null ? name.equals(keyTest.name) : keyTest.name == null;     }      @Override     public int hashCode() {          return name != null ? name.hashCode() : 0;     } }
  冲突的类@Setter @NoArgsConstructor public class KeyTest {     private String name;      private Random random;      public KeyTest(Random random){         this.random = random;     }      @Override     public boolean equals(Object o) {         if (this == o) return true;         if (o == null || getClass() != o.getClass()) return false;          KeyTest keyTest = (KeyTest) o;          return name != null ? name.equals(keyTest.name) : keyTest.name == null;     }      @Override     public int hashCode() {         // return name != null ? name.hashCode() : 0;         return random.nextInt(1000);     } }
  众所周知,hashmap在做put的时候,先根据key求hashcode,找到数组下标位置,如果该位置有元素,再比较equals,如果返回true,则替换该元素并返回被替换的元素;否则就是哈希冲突了,即hashcode相同但equals返回false。
  哈希冲突的时候在冲突的数组处形成数组,长度达到8以后变成红黑树。1.2 java的基准测试。
  这里使用JMH进行基准测试.
  JMH是Java Microbenchmark Harness的简称,一般用于代码的性能调优,精度甚至可以达到纳秒级别,适用于 java 以及其他基于 JVM 的语言。和 Apache JMeter 不同,JMH 测试的对象可以是任一方法,颗粒度更小,而不仅限于rest api.
  jdk9以上的版本自带了JMH,如果是jdk8可以使用maven引入依赖。
  点击查看JMH依赖2.测试初始化长度
  点击查看初始化长度基本测试代码
  测试结果图
  对测试结果图例做一个简单的说明:
  以上基准测试,会得到一个json格式的结果。然后将该结果上传到官方网站,会得到一个上述图片的结果。
  横坐标,红色驻图代表有冲突,浅蓝色驻图无冲突。
  众坐标,ops/ns代表平均每次操作花费的时间,单位为纳秒,1秒=1000000000纳秒,这样更精准。
  下同。
  简单说,驻图越高代表性能越低。
  我测了两次,分别是无哈希冲突和有哈希冲突的,这里只贴一种结果。
  测试结果表明,hashmap定义时有初始化对比无初始化,有大约4%到12%的性能损耗。
  足够的初始化长度下,有哈希冲突的测试结果:
  足够的初始化长度下,没有哈希冲突的测试结果:
  3.模拟一百万个元素put,get的差异。
  众所周知,hashmap在频繁做resize时,性能损耗非常严重。以上是没初始化长度,无冲突和有冲突的情况下,前者性能是后者性能的53倍。
  那么在初始化长度的情况下呢?HashMap map = new HashMap(1000000);
  同样的代码下,得到的测试结果
  以上是有初始化长度,无冲突和有冲突的情况下,前者性能是后者性能的58倍。
  大差不差,不管有无初始化长度,无冲突的效率都是有冲突效率的50倍以上。说明,这是哈希冲突带来的性能损耗。4.模拟无红黑树情况下get效率4.1 将random扩大,哈希冲突严重性大大减小,模拟大多数哈希冲突导致的哈希链长度均小于8,无法扩展为红黑树,只能遍历数组。
  将KeyTest的hashcode方法改为:@Override     public int hashCode() {         // return name != null ? name.hashCode() : 0;         return random.nextInt(130000);     }
  这样1000000/130000 < 8,这样大多数的哈希链将不会扩展为红黑树。
  测试结果为:
  测试结果说明,**有冲突的效率反而比无冲突的效率要高**,差不多高出80%左右。
  这其实有点违反常识,我们通常讲,hashmap要尽量避免哈希冲突,哈希冲突的情况下写入和读取性能都会受到很大的影响。
  但是上面的测试结果表明,大数据量相对比较大的时候,适当的哈希冲突(<8)反而读取效率更高。
  个人猜测是,适当的哈希冲突,数组长度大为减少。
  为了证明以上猜想,直接对ArrayList进行基准测试。4.1.1 ArrayList不同长度下get效率的基准测试
  模拟一个哈希冲突非常严重下,底层数组长度较小的list,和哈希冲突不严重情况下,底层数组较大的list,再随机测试Get的效率如何。
  点击查看测试代码
  测试结果如下:
  可以看到,这里不能(有误,待重测)间接证实了以上的猜想。
  当然这里的代码可能并不严谨,也欢迎大家一起讨论。4.2 jdk1.8版本,哈希冲突严重下的get效率测试
  测试结果说明:在jdk8,无冲突效率是有有冲突的3倍左右。4.3 将jdk版本降为1.7,在哈希冲突依然严重的情况下,get效率如何?
  测试结果说明:在jdk7,无冲突效率是有有冲突的12倍左右。
  结合4.1和4.2的测试对比,说明jdk1.8红黑树的优化效率确实提升很大。5.总结
  1.初始化的时候指定长度,长度要考虑到负载因子0.75.初始化的影响受到哈希冲突的影响,没有那么大(相对于倍数而言),但也不小。
  2.哈希冲突严重时,put性能急剧下降。(几十倍级)
  3.相同元素个数的前提下,在哈希冲突时,get效率反而更高。
  4.相比之前的版本,哈希冲突严重时,jdk8红黑树对get效率有非常大的提升。
  测试代码和测试结果在 这里
  苍茫之天涯,乃吾辈之所爱也;浩瀚之程序,亦吾之所爱也,然则何时而爱耶?必曰:先天下之忧而忧,后天下之爱而爱也!

月薪4万是一种什么样的感受?月薪4万,税后3。5万左右,每天两餐省着吃50,每星期下一顿馆子300,每个月房租4400,还是和别人合租,主卧独卫),水电100,生活用品100,水果400,老家房子月供3000为什么有人一次就考上了公务员,为什么有人考了很多次都考不上?我是10年大学毕业,12年参加过一次国考,被调剂,13年参加过一次省考,考了第五名,之后再没考过,直到17年突然决定再考,本来很多年没有学习了,我没想的一次考上,先摸摸底,我给自己劳务派遣到政府单位上班有没有发展前途?讲几个身边的真实案例。近几年,我们单位由于编制有限,工作任务繁重,单位人手一直很紧缺。为了解决人手问题,单位先后招聘了多名劳务派遣人员。这些劳务派遣人员中,不乏能力出众之人,不管是国防科技大学究竟厉害在哪里?大家好,我是风追云,很荣幸回答这个问题。国防科技大学是985,211,是军队唯一一个进入国家985工程建设的学校。可以说是军校中的清华大学,中国军校中最顶尖的存在。全名为中国人民解职业学校最受欢迎的专业是什么?职业院校其实最受欢迎的专业就是好就业的专业,在我看来,如下专业比较受欢迎。1。土木专业。首先土木专业毕业去工地肯定是又苦又累,但天下没有很舒服的工作。专科众所周知,专科毕业没有特别合肥市民办出国护照需要哪些?两种方式现场办理和网上办理第一现场办理1办理地点合肥公安局出入境管理局2办理时间周一至周五,90017003办理条件分两种情况,合肥户籍和非合肥户籍合肥户籍(1)年满16周岁的携带2017年高考全国2卷数学(理)难度比往年如何?今年实体总体感觉比较亲民,很多知识点都是在平时训练中,试题难度其实并不大,但是对于平时基础的学习要求却很高,对于计算能力的考察也是重点,这就要求学生在学习的过程中加强对基础知识的熟大学绩点是多少说明你成绩还可以?首先这个话题我真是太有话说了。先看一下我刚刚查看的这学期成绩。其实大学生最重要的是学分绩点!以我的经验来看大学老师给分大都是七十多或者八十多,很少有九十多分的。成绩的十位数上数字为现在上海市最好的大学是哪一所?每每谈到上海,我的内心就不免惊起一阵波澜,内心想上海真是一个神奇的城市,我想魔都应该是人们对上海这座城市最好的诠释吧。因为他不仅是一座经济发展极度极度全面的城市,实现了很多很多的梦由于公司调整,没有适合岗位,公司要求我自己辞职,不提供n1,我该怎么办?公司这种做法明显实在耍流氓,你当然可以维护自己的权益,但从描述来看,你现在的状态更多的是气愤和焦虑,这并不利于解决问题。首先,公司调整没有适合岗位,这很可能是事实,责怪公司没有意义江西的二本学校有哪些?江西省二本大学有南昌航空大学江西农业大学东华理工大学江西理工大学江西中医药大学景德镇陶瓷大学赣南师范大学江西科技师范大学南昌工程学院井冈山大学九江学院宜春学院上饶师范学院南昌师范学
小公司做亚马逊,没有插件,该怎么选品?谢邀。对于选品模块,大部分公司的开发都会使用插件进行数据参考,但是没有插件就没有解决方案了吗?当然不是,亚马逊官网上的公开数据就有大量的选品参考给到我们。那就是大名鼎鼎的亚马逊三大国考公务员有多难考?国考难不难?不同人的有不同的看法,笔者认为,考公务员难,一是难在报名人数多竞争力度大,本来独木桥只能走一人,现在成百千上万的人一拥而上,难免会造成拥堵,或掉下桥去。如果你报考的是热想开户期货账户,请问期货公司哪家靠谱?并不是排名越靠前的期货公司越靠谱,国内正规的期货公司有140多家,在期货业协会的官网上都能查得到,所有在册的期货公司都是正规的,跟这些期货公司合作没有资金安全的问题。既然所有的期货婴儿晚上睡觉应该开夜灯吗?您好,不需要。研究表明,灯光可能会促使正在迅速发育的婴幼儿的眼睛发生变化。尽管他们的眼睛闭着,灯光仍会透过眼皮进入眼睛。对婴儿幼儿来说,开灯睡觉尤其不好。任何人工光源都会产生一种很可以推荐几个可以让儿童长高长壮的菜(感兴趣自己吃那种)吗,最好有做法?可以推荐几个可以让儿童长高长壮的菜(感兴趣自己吃那种)吗,最好有做法?喜吃爱做乐分享,大家好,我是练马甲线的吃嘴精,也是一个挑嘴男孩的妈妈。长高长壮,是我家多年来的一贯追求目标,原怀孕多少周入盆正常?有没有38周入盆的呢?怀孕多少周入盆正常?有没有38周入盆的呐?一般情况下,初产妇孕36周入盆,经产妇在临产前入盆,但是具体多少周入盆还得看胎儿跟孕妇情况,有些胎儿入盆比较早,孕33周就入盆成功,还有些DNF超时空漩涡最受欢迎的职业被称之为四大天王你知道是哪四个职业吗?肯定没有狂战,绝对没有狂战,一定没有狂战,对于超时空漩涡,这个二五C横行的副本,最受欢迎的职业肯定是二五C,被称之为四大天王的职业那肯定是以下几个。第一幻神鬼泣3200面板的红眼被为什么大多男球迷都认为巴乔比贝克汉姆帅,而女球迷则相反呢?我就喜欢巴乔,从来没有觉得小贝帅,觉得他有些娘的感觉!个人见解,非喜勿喷!女的,我觉着巴乔帅,这是差点封王的球员。00后没有看过他一场球赛,犹然瞻仰当年英资。而贝克汉姆觉着不专注,士气正盛!意甲15轮国米战保级球队,蓝黑军团能否高歌猛进?作为上赛季意甲联赛的卫冕冠军,蓝黑军团国际米兰虽然在赛季之初的表现不如预期,在积分榜上被那不勒斯和AC米兰甩在了身后,但是随着赛季的深入,蓝黑军团阵容深度上的优势逐渐体现了出来,近个人有犯罪前科能创办企业吗?创办的企业能上市吗?根据我国法律的终生案底制度,犯罪被判刑收监过的人在以后就业和创业方面,有诸多限制。其中最基本的一项规定就是有案底的人不能担任企业高管和法人代表!因此,题主说的有案底虽然并不影响创业企业云盘哪个好?企业云盘是一项专为企业打造的云存储服务,企业云盘致力于为广大企业用户打造集存储备份同步共享为一体的云办公平台,企业云盘可以让大家无论何时何地都可快速查看管理企业团队工作文档,让大家
友情链接:快好知快生活快百科快传网中准网文好找聚热点快软件