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,一经查实,立即删除!

相关文章

spoj1026 favorite dice

1 #include <bits/stdc.h>2 using namespace std;3 int n,t;4 const int N 1200;5 double dp[N];6 /*7 甩一个n面的骰子&#xff0c;问每一面都被甩到的需要甩的次数期望是多少。8 dp[i]&#xff1a;已经甩到i个面了&#xff0c;要达到n个面还需要次数的期望9 显然dp[…

switch 失效

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

纯php socket mysql_PHP 连接 unix_socket MySQL

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

html-其他常见标签的使用

b&#xff1a;加粗 s&#xff1a;删除线 u&#xff1a;下划线 i&#xff1a;斜体 per&#xff1a;原样输出 sup:上标 sub:下标 p&#xff1a;段落标签 比br多一行 &#xff08;CSS&#xff09; div&#xff1a;自动换行 span&#xff1a;在一行显示 完整代码&#xff1a; <h…

在OpenShift上将JMS与JBoss A-MQ结合使用。 从远程客户端和加密中学到的经验教训。...

OpenShift是“红帽开发的开放式混合云应用程序平台”。 它具有不同的风格&#xff0c;对于大多数您想做的事情&#xff0c;最有趣的部分是公共云应用程序开发和托管平台“ OpenShift Online ”。 您可以轻松地尝试一下&#xff0c;因为在云中使用OpenShift Online是免费的&…

[Swift]LeetCode281. 之字形迭代器 $ Zigzag Iterator

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号&#xff1a;山青咏芝&#xff08;shanqingyongzhi&#xff09;➤博客园地址&#xff1a;山青咏芝&#xff08;https://www.cnblogs.com/strengthen/&#xff09;➤GitHub地址&a…

SpringBoot整合系列-PageHelper分页插件

原创作品&#xff0c;可以转载&#xff0c;但是请标注出处地址&#xff1a;https://www.cnblogs.com/V1haoge/p/9971043.html SpringBoot整合MyBatis分页插件PageHelper 步骤 第一步&#xff1a;首先整合MyBatis 参照之前SpringBoot整合系列-整合MyBatis 第二步&#xff1a;添加…

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

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

scss-@extend

extend指令用于共享规则和选择器之间的关系。它可以扩展所有其他类的样式在一个类中&#xff0c;也可应用于自己特定的样式。 查看如下scssextend示例&#xff1a; .style{font-size: 30px;font-style: italic; }h2{color: #787878;extend .style} .container{extend h2 } 编译…

JavaSE 7,8:确定特定文件系统支持的视图

如果您对文件或目录有疑问&#xff0c;例如是否隐藏文件&#xff0c;是否为目录&#xff0c;文件的大小以及文件的所有者&#xff0c;则可以从元数据中获得这些问题&#xff08;以及许多其他问题&#xff09;的答案&#xff0c;这是关于其他数据的数据。 NIO.2将元数据的概念与…

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

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

13.看板方法——使用两层系统扩展看板笔记

00.看板方法的第一条原则是&#xff1a;对在制品设置限额&#xff0c;并通过使用一个可视化的信号系统来拉动工作。 01.大型项目也需要大家对优先级排序节奏达成共识&#xff0c;及时对输入队列进行填充。一般的规则是&#xff0c;会议越频繁今儿节奏越紧凑越好。 02.规模更小、…

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

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

scss-@for 指令

此指令用于循环输出&#xff0c;具有两种循环方式&#xff0c;下面分别做一下介绍。 &#xff08;1&#xff09;.for $var from <start> through <end>: 此种方式的遍历索引区间是[start,end]&#xff0c;scss代码实例如下: for $i from 1 through 3 {.item-#{$i} …

Python开发【第六篇】:模块

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

yocto 离线编译

使用yocto编译一个软件包时&#xff0c;一般会先在本地寻找下载好的源码包&#xff0c;如果不存在则根据配置从网络下载。 添加本地源码包 为了支持离线编译&#xff0c;添加一个包的配置文件后&#xff0c;需要在本地也准备好源码包。 可以先打开网络连接&#xff0c;让yocto帮…

mysql 帐号开启远程_两大步骤教您开启MySQL 数据库远程登陆帐号

在工作实践和学习中&#xff0c;如何开启 MySQL 数据库的远程登陆帐号算是一个难点的问题&#xff0c;以下内容便是在工作和实践中总结出来的两大步骤&#xff0c;能帮助DBA们顺利的完成开启 MySQL 数据库的远程登陆帐号。1、确定服务器上的防火墙没有阻止 3306 端口MySQL 默认…

scss-字符串连接符

运算可用于连接字符串: // SCSS p {cursor: e -resize; } // 编译后的 CSS 样式 p {cursor: e-resize; } 请注意&#xff0c;如果带引号的字符串被添加到不带引号的字符串中&#xff08;也就是说&#xff0c;带引号的字符串在 的左侧&#xff09;&#xff0c; 那么返回的结…

用于Play框架分布式应用程序的Init.d Shell脚本

我编写了一个Shell脚本来控制使用内置命令dist打包的Play框架应用程序。 以这种方式打包的应用程序是压缩的独立发行版&#xff0c;不需要在应该运行其的计算机上安装Play框架。 所需的一切都在包装内。 在zip的bin目录中&#xff0c;有一个可执行的Shell脚本&#xff0c;其名称…

在Java中使用内存映射文件时检测(写入)失败

内存映射文件是一个很好的并且经常被忽视的工具。 我不会在这里详细介绍它们的工作方式&#xff08;使用 力 Google Luke&#xff01;&#xff09;&#xff0c;但我将快速总结其优势&#xff1a; 操作系统提供的延迟加载和写入缓存&#xff08;您不必自己编写&#xff0c;并…