scala集合转java_Java,Scala,Guava和Trove集合-它们可以容纳多少数据?
scala集合轉(zhuǎn)java
關(guān)于我們的數(shù)據(jù)結(jié)構(gòu)的一個(gè)有趣的事情是,即使我們非常熟悉它們,但對(duì)于我們來說,仍然很難說出像HashMap這樣基本的東西在1GB的內(nèi)存中可以容納多少個(gè)項(xiàng)目。 我們可能會(huì)在學(xué)校,高級(jí)開發(fā)人員那里學(xué)到這一點(diǎn),或者由于數(shù)據(jù)結(jié)構(gòu)選擇不當(dāng)而導(dǎo)致服務(wù)器崩潰時(shí),我們可能會(huì)以艱難的方式來學(xué)習(xí)。 所以我決定這樣做。 我從大約20個(gè)最流行的Java,Scala,Guava和Trove集合中進(jìn)行了測(cè)試,并測(cè)試了它們每個(gè)在1GB內(nèi)存的JVM(通過-Xmx)中可以容納多少個(gè)隨機(jī)整數(shù)。 對(duì)于每個(gè)數(shù)據(jù)結(jié)構(gòu),我們都附加int,直到收到OutOfMemoryError為止,該錯(cuò)誤結(jié)束了測(cè)試。 為了確保一致性,我們?cè)贘DK 7上運(yùn)行了每個(gè)測(cè)試5次。 對(duì)于這種基本測(cè)試,我發(fā)現(xiàn)其中一些結(jié)果令人驚訝。 *我想我們不在同一頁(yè)上,因?yàn)檫@不是競(jìng)爭(zhēng)。 不同的集合具有不同的語(yǔ)義。 我也沒有包括時(shí)間,因?yàn)橹攸c(diǎn)不是微基準(zhǔn)測(cè)試性能,而是讓我們了解我們?nèi)粘J褂玫氖詹貙?shí)際上可以容納多少。
結(jié)果
- Scala的集合比Java具有更大的容量。 Scala集合似乎比Java集合更有效。 雖然某些集合(例如TreeSets)的表現(xiàn)大致相同,但其他集合(例如Scala的HashMaps)卻能夠容納近15%的物品。 HashSet可以容納的項(xiàng)目比Java同類項(xiàng)目多8%。 我很想聽聽社區(qū)人士為什么這么認(rèn)為。 Scala的ArrayBuffer相對(duì)于ArrayList具有一點(diǎn)優(yōu)勢(shì)。
- 唯一的例外是Scala的鏈表,它比Java的LinkedList所保存的數(shù)據(jù)少18%。 這里的一個(gè)約束是,為了追加到列表,它需要接收另一個(gè)鏈接列表而不是直接值。 即使這樣,假設(shè)臨時(shí)列表是GC的,它本身也不會(huì)影響列表在1GB JVM中的容納容量。
*我們正在計(jì)算持有的int數(shù),這意味著每張地圖插入2 int。
- 如果您不使用Trove,那么您會(huì)錯(cuò)過。 從第一天開始,我們就一直在Takipi的后端使用Trove的收藏。 好吧,可惜不是從第一天開始,因?yàn)檫@可以節(jié)省我們很多時(shí)間來優(yōu)化服務(wù)器代碼。 TIntArrayList能夠容納250%的Scala和Java盒裝同類產(chǎn)品,這些數(shù)字足以說明一切。
- 對(duì)于地圖觀察到相似的比率。 令人驚訝的是,Trove的映射性能超過Java和Scala列表超過50%。 請(qǐng)記住,您還具有從int到Object的Trove集合映射,反之亦然,因此您不需要完全原始的映射即可享受容量的好處。
- 即使這樣,我們?nèi)匀豢吹絋rove的TIntLinkedList可以容納比裝箱它們的原語(yǔ)的Java ArrayList或Scala ArrayBuffer更少的數(shù)據(jù)。 這確實(shí)使您可以查看在您的代碼中大量使用的鏈表并重新考慮-我絕對(duì)需要它嗎?
- 由于使用Trove集合與標(biāo)準(zhǔn)庫(kù)的集合實(shí)際上沒有開銷,因此我不會(huì)將使用它們歸類為“按需優(yōu)化”方案。 這是因?yàn)閮?nèi)存消耗錯(cuò)誤通常會(huì)在規(guī)模上顯現(xiàn),這是最難發(fā)現(xiàn)的錯(cuò)誤,因此您必須開始進(jìn)行生產(chǎn)調(diào)試 (當(dāng)然Trove不會(huì)使您擺脫固有的效率低下的算法)。 有時(shí)可能是分析核心轉(zhuǎn)儲(chǔ)和觀看巨人比賽之間的區(qū)別。
- 番石榴–大地圖,小套。 番石榴的多套產(chǎn)品比Java和Scala的同類產(chǎn)品價(jià)格更高。 與Scala的設(shè)置相比,它們能夠保存的數(shù)據(jù)量減少了19%。 不利的一面當(dāng)然是,他們可以執(zhí)行使用標(biāo)準(zhǔn)集合語(yǔ)義不可能完成的事情。 只要多集將在您的內(nèi)存結(jié)構(gòu)中扮演重要角色,請(qǐng)確保您需要這些。
- 對(duì)于多貼圖,我們看到的情況恰恰相反。 Guava的MultiHashMap比Java的hashmap擁有的值多20%,比Scala的多10%。 看到雖然Guava的多集在容量方面不及Java和Scala等價(jià)物,但MultiMap實(shí)際上卻勝過Java和Scala。
那里有很多其他的收集類型(隊(duì)列,堆棧等),但是我想從基礎(chǔ)開始,并根據(jù)受歡迎的需求添加更多的收集類型。 因此,如果您想在列表中看到另一個(gè)收藏夾,或者想進(jìn)一步了解某些功能上的差異,請(qǐng)?jiān)谙旅娴脑u(píng)論部分中知道該怎么做。
- 該代碼可在此處獲得 。
翻譯自: https://www.javacodegeeks.com/2014/01/java-scala-guava-and-trove-collections-how-much-data-can-they-hold.html
scala集合轉(zhuǎn)java
總結(jié)
以上是生活随笔為你收集整理的scala集合转java_Java,Scala,Guava和Trove集合-它们可以容纳多少数据?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: J2Pay –入门
- 下一篇: 带有NetBeans 10的Java E