Java,Scala,Guava和Trove集合-它们可以容纳多少数据?
關(guān)于我們的數(shù)據(jù)結(jié)構(gòu),令人著迷的事情之一是,即使我們對(duì)它們非常熟悉,我們?nèi)匀缓茈y說(shuō)出像HashMap這樣基本的東西在1GB的內(nèi)存中可以容納多少個(gè)項(xiàng)目。 我們可能會(huì)在學(xué)校,高級(jí)開(kāi)發(fā)人員那里學(xué)到這一點(diǎn),或者由于數(shù)據(jù)結(jié)構(gòu)選擇不當(dāng)而導(dǎo)致服務(wù)器崩潰時(shí),可能會(huì)遇到困難。 所以我決定這樣做。 我從約20個(gè)最流行的Java,Scala,Guava和Trove集合中進(jìn)行了測(cè)試,并測(cè)試了它們中每個(gè)具有1GB內(nèi)存的JVM可以容納多少個(gè)隨機(jī)整數(shù)(通過(guò)-Xmx)。 對(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ǔ)義。 我也沒(méi)有包括時(shí)間,因?yàn)橹攸c(diǎn)不是微基準(zhǔn)測(cè)試性能,而是讓我們了解我們?nèi)粘J褂玫氖詹貙?shí)際上可以容納多少。
結(jié)果
- Scala的集合具有比Java更大的容量。 Scala集合似乎比Java集合更有效率。 雖然某些集合(例如TreeSets)的表現(xiàn)大致相同,但其他集合(例如Scala的HashMaps)卻能夠容納近15%的項(xiàng)目。 HashSet可以容納的項(xiàng)目比Java同類(lèi)項(xiàng)目多8%。 我很想聽(tīng)聽(tīng)社區(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ò)過(guò)。 從第一天開(kāi)始,我們就一直在Takipi的后端上使用Trove的收藏。 好吧,可悲的是從第一天開(kāi)始,因?yàn)檫@將為我們節(jié)省大量時(shí)間來(lái)優(yōu)化服務(wù)器代碼。 TIntArrayList能夠容納250%的Scala和Java盒裝同類(lèi)產(chǎn)品,這些數(shù)字足以說(shuō)明一切。
- 對(duì)于地圖觀察到相似的比率。 令人驚訝的是,Trove的映射性能超過(guò)Java和Scala列表超過(guò)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í)際上沒(méi)有開(kāi)銷(xiāo),因此我不會(huì)將使用它們歸類(lèi)為“按需優(yōu)化”方案。 這是因?yàn)閮?nèi)存消耗錯(cuò)誤通常會(huì)在規(guī)模上顯現(xiàn),這是最難發(fā)現(xiàn)的錯(cuò)誤,因此您必須開(kāi)始進(jìn)行生產(chǎn)調(diào)試 (當(dāng)然Trove不會(huì)使您擺脫固有的效率低下的算法)。 有時(shí)可能是分析核心轉(zhuǎn)儲(chǔ)和觀看巨人比賽之間的區(qū)別。
- 番石榴–大地圖,小套。 番石榴的多套產(chǎn)品比Java和Scala的同類(lèi)產(chǎn)品價(jià)格更高。 與Scala的設(shè)置相比,它們能夠保存少19%的數(shù)據(jù)。 不利的一面當(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í)際上卻勝過(guò)Java和Scala。
那里有更多的集合類(lèi)型(隊(duì)列,堆棧等),但是我想從基礎(chǔ)開(kāi)始,并為每個(gè)受歡迎的需求添加更多。 因此,如果您想在列表中看到另一個(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
總結(jié)
以上是生活随笔為你收集整理的Java,Scala,Guava和Trove集合-它们可以容纳多少数据?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 北京二类医疗器械备案要求(北京二类医疗器
- 下一篇: 在OpenShift上将JMS与JBos