Java,Scala,Guava和Trove集合-它们可以容纳多少数据?

球池_-1 关于我们的数据结构,令人着迷的事情之一是,即使我们对它们非常熟悉,我们仍然很难说出像HashMap这样基本的东西在1GB的内存中可以容纳多少个项目。 我们可能会在学校,高级开发人员那里学到这一点,或者由于数据结构选择不当而导致服务器崩溃时,可能会遇到困难。 所以我决定这样做。 我从约20个最流行的Java,Scala,Guava和Trove集合中进行了测试,并测试了它们中每个具有1GB内存的JVM可以容纳多少个随机整数(通过-Xmx)。 对于每个数据结构,我们都附加int直到收到OutOfMemoryError为止,该错误结束了测试。 为了确保一致性,我们在JDK 7上运行了每个测试5次。 对于这种基本测试,我发现其中一些结果令人惊讶。 *我想我们不在同一页上,因为这不是竞争。 不同的集合具有不同的语义。 我也没有包括时间,因为重点不是微基准测试性能,而是让我们了解我们日常使用的收藏实际上可以容纳多少。

结果

  • Scala的集合具有比Java更大的容量。 Scala集合似乎比Java集合更有效率。 虽然某些集合(例如TreeSets)的表现大致相同,但其他集合(例如Scala的HashMaps)却能够容纳近15%的项目。 HashSet可以容纳的项目比Java同类项目多8%。 我很想听听社区人士为什么这么认为。 Scala的ArrayBuffer相对于ArrayList具有一点优势。
  • 唯一的例外是Scala的链表,它比Java的LinkedList所保存的数据少18%。 这里的一个约束是,为了追加到列表,它需要接收另一个链接列表而不是直接值。 即使这样,假设临时列表是GC的,它本身也不会影响列表在1GB JVM中的容纳容量。

多少数据_3-1

*我们正在计算持有的int数,这意味着每张地图插入2 int。

  • 如果您不使用Trove,那么您会错过。 从第一天开始,我们就一直在Takipi的后端上使用Trove的收藏。 好吧,可悲的是从第一天开始,因为这将为我们节省大量时间来优化服务器代码。 TIntArrayList能够容纳250%的Scala和Java盒装同类产品,这些数字足以说明一切。
  • 对于地图观察到相似的比率。 令人惊讶的是,Trove的映射性能超过Java和Scala列表超过50%。 请记住,您还具有从int到Object的Trove集合映射,反之亦然,因此您不需要完全原始的映射即可享受容量的好处。
  • 即使这样,我们仍然看到Trove的TIntLinkedList可以容纳比装箱它们的原语的Java ArrayList或Scala ArrayBuffer少的数据。 这确实使您可以查看在您的代码中大量使用的链表并重新考虑-我绝对需要它吗?
  • 由于使用Trove集合与标准库的集合实际上没有开销,因此我不会将使用它们归类为“按需优化”方案。 这是因为内存消耗错误通常会在规模上显现,这是最难发现的错误,因此您必须开始进行生产调试 (当然Trove不会使您摆脱固有的效率低下的算法)。 有时可能是分析核心转储和观看巨人比赛之间的区别。
  • 番石榴–大地图,小套。 番石榴的多套产品比Java和Scala的同类产品价格更高。 与Scala的设置相比,它们能够保存少19%的数据。 不利的一面当然是,他们可以执行使用标准集合语义不可能完成的事情。 只要多集将在您的内存结构中扮演重要角色,请确保您需要这些。
  • fredForBlog

  • 对于多贴图,我们看到的情况恰恰相反。 Guava的MultiHashMap比Java的hashmap拥有的值多20%,比Scala的多10%。 看到虽然Guava的多集在容量方面不及Java和Scala等价物,但MultiMap实际上却胜过Java和Scala。

那里有更多的集合类型(队列,堆栈等),但是我想从基础开始,并为每个受欢迎的需求添加更多。 因此,如果您想在列表中看到另一个收藏夹,或者想进一步了解某些功能上的差异,请在下面的评论部分中知道该怎么做。

  • 该代码可在此处获得 。

参考: Java,Scala,Guava和Trove集合-它们可以容纳多少数据? 来自我们的JCG合作伙伴 Tal Weiss的Takipi博客。

翻译自: https://www.javacodegeeks.com/2014/01/java-scala-guava-and-trove-collections-how-much-data-can-they-hold.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/364926.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

switch 失效

switch 开关失效无法切换,可以关闭,无法开启。 发现问题点 require-table.js 中toggle value的数据类型不是 number 导致 (value ? no : yes )判断总为no; 前面将value 强制转换为number类型即可 转载于:https://www.cnblogs.c…

纯php socket mysql_PHP 连接 unix_socket MySQL

当MySQL使用Unix Socket启动时,直接使用localhost会发生了一个数据库错误,发生无法连接数据库错误。 Warning: mysql_connect() [function.mysql-connect]: [2002] 这时应当修改hostname,例如在CI 配置数据库 (database.php) 从: …

mysql为什么不能插入数据_mysql为啥不能插入数据

mysql为何不能插入数据?安装AppServ后首次使用mysql,没有图形界面,在“MySql Command Line Client”的操作如下:mysql> create database cars;Query OK, 1 row affected (0.00 sec)mysql> use cars;Database changedmysql&g…

mocha 测试 mysql_e2e 自动化集成测试 架构 实例 WebStorm Node.js Mocha WebDrive

e2e 自动化集成测试 架构 京东 商品搜索 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step 二 图片验证码的识别 , 下面讲一下Node.js中如何访问数据库, 在做自动化测试过程中, 经常可能遇到需要到数据库取值,或是…

在Window上使用Jenkins自动发布Java工件

这篇文章将展示如何使用Jenkins Continuous Integration自动执行Java Web应用程序(使用MYSQL DB和基于Hibernate ORM在基于REST的Jersey2 Spring环境中开发的学生申请应用程序)的发布过程-上载发布工件到发布存储库。 如上一篇文章在Windows上使用Jenkin…

Python开发【第六篇】:模块

Python开发【第六篇】:模块 模块,用一砣代码实现了某个功能的代码集合。 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来…

在jsp文件中通过超链接访问servlet_Eclipse中创建Servlet

1.新建test1.jsp文件,输入如下代码代码解释:一个超链接,跳转到forwardServlet注意forwardServlet 这里是个Servlet2.在工程中新建Servlet3.输入Class名称,注意下边的Supper Class 它自动继承了HttpServlet选择next4.Create Servle…

C# 多线程学习系列四之ThreadPool取消、超时子线程操作以及ManualResetEvent和AutoResetEvent信号量的使用...

1、简介 虽然ThreadPool、Thread能开启子线程将一些任务交给子线程去承担,但是很多时候,因为某种原因,比如子线程发生异常、或者子线程的业务逻辑不符合我们的预期,那么这个时候我们必须关闭它,而不是让它继续执行,消耗资源.让CPU不在把时间和资源花在没有意义的代码上. 2、主线…

Oracle学习:新建表空间

1. 以 sysdba 身份登入Oracle sqlplus / as sysdba; 2. 创建表空间 create tablespace (空间名)fwptfs (数据文件存放路径)datafile D:\xxx (初始大小)size 500m (自动扩容,每次200m)autoextend on next 200m; 3. 创建用户 create user (用户名)fwptfs…

tomcat7使用dbcp连接池遇到的坑

项目部署在tomcat后每隔一段时间便会报错 Cause: java.sql.SQLException: Could not retrieve transation read-only status server ; SQL []; Could not retrieve transation read-only status server; nested exception is java.sql.SQLException: Could not retrieve transa…

纯CSS实现3D照片墙

HTML部分&#xff1a; <body><div class"photo-wrap"> <!-- 舞台 --><div class"container"> <!-- 容器 --><div class"img">我是中心</div><div class"img img01"><img src&q…

Guava之RangeMap

在Guava官方API上面可以得知&#xff1a;RangeMap是一种集合类型( collection type)&#xff0c;它将不相交、且不为空的Range&#xff08;key&#xff09;映射给一个值&#xff08;Value&#xff09;。和RangeSet不一样&#xff0c;RangeMap不可以将相邻的区间合并&#xff0c…

CSS3新增的伪类选择器

伪类选择器的作用&#xff1a;对已有选择器做进一步的限制&#xff0c;对已有选择器能匹配的元素做进一步的过滤。CSS 3提供的伪类选择器主要分为以下三类&#xff1a; 结构性伪类选择器UI元素状态伪类选择器其他伪类选择器 1、结构性伪类选择器 Selector:root&#xff1a;匹…

签名SOAP消息–生成封装的XML签名

数字签名是使数字内容真实可信的一种广泛使用的机制。 通过为某些内容生成数字签名&#xff0c;我们可以让另一方能够验证该内容。 通过此验证&#xff0c;它可以保证在我们签名后不会更改。 通过这个示例&#xff0c;我将分享如何为SOAP信封生成签名。 但是&#xff0c;这当然…

2019 The 19th Zhejiang University Programming Contest

感想&#xff1a; 今天三个人的状态比昨天计院校赛的状态要好很多&#xff0c;然而三个人都慢热体质导致签到题wa了很多发。最后虽然跟大家题数一样(6题)&#xff0c;然而输在罚时。 只能说&#xff0c;水题还是刷得少&#xff0c;看到签到都没灵感实在不应该。 题目链接&#…

openvas安装和基本使用

OpenVAS是开放式漏洞评估系统&#xff0c;也可以说它是一个包含着相关工具的网络扫描器。OpenVAS是开放式漏洞评估系统&#xff0c;也可以说它是一个包含着相关工具的网络扫描器。其核心部件是一个服务器&#xff0c;包括一套网络漏洞测试程序&#xff0c;可以检测远程系统和应…

修改mysql编码方式centos_CentOS下修改mysql数据库编码为UTF-8(附mysql开启远程链接和开放3306端口)...

楼主在配置好linux云服务器的jdk,tomcat,mysql后&#xff0c;当要开始部署项目是&#xff0c;忽然意识到一个很严重的问题&#xff0c;那就是数据库的编码问题&#xff0c;自安装完成后并未修改数据库的额编码。。。。下面就来讲说linux下修改mysql的编码问题吧。。有一个问题网…

srtvlet filter

Filter&#xff0c;过滤器&#xff0c;顾名思义&#xff0c;即是对数据等的过滤&#xff0c;预处理过程。为什么要引入过滤器呢&#xff1f;在平常访问网站的时候&#xff0c;有时候发一些敏感的信息&#xff0c;发出后显示时 就会将敏感信息用*等字符替代&#xff0c;这就是用…

mysql怎么合并行_mysql怎么合并行

mysql合并行的方法&#xff1a;使用函数【GROUP_CONCAT()】&#xff0c;代码为【SELECT am.activeId,GROUP_CONCAT(m.modelName SEPARATOR ‘,’) modelName】。【相关学习推荐&#xff1a;mysql学习】mysql合并行的方法&#xff1a;一个字段可能对应多条数据&#xff0c;用mys…

将旧项目从Ant迁移到Maven的4个简单步骤

一段时间以来&#xff0c;我们一直在考虑将构建从蚂蚁移植到Maven。 它发生在上个月&#xff0c;实际上比我们预期的要简单。 根据我的经验&#xff0c;这里简要介绍了我们遵循的步骤。 我们的应用程序是一个具有多个框架和技术的企业Web应用程序构建&#xff0c;并作为单个WAR…