ไลบรารี Java Collections ที่มีประสิทธิภาพที่สุดคืออะไร [ปิด]


135

ไลบรารี Java Collections ที่มีประสิทธิภาพที่สุดคืออะไร

ไม่กี่ปีที่ผ่านมาผมไม่มากของ Java และมีความประทับใจกลับมาแล้วว่าขุมที่ดีที่สุด (ที่มีประสิทธิภาพมากที่สุด) การใช้ Java คอลเลกชัน แต่เมื่อผมได้อ่านคำตอบของคำถามที่ว่า " มีประโยชน์ห้องสมุดฟรี Java มากที่สุด? " ผมสังเกตเห็นว่าขุมถูกกล่าวถึงแทบจะไม่ ดังนั้นไลบรารี Java Collections ใดที่ดีที่สุดในตอนนี้

UPDATE:เพื่อชี้แจงฉันต้องการทราบว่าส่วนใหญ่ของไลบรารีที่จะใช้เมื่อฉันต้องเก็บรายการนับล้านไว้ในตารางแฮช ฯลฯ (ต้องการรันไทม์และหน่วยความจำขนาดเล็ก)


กุญแจและค่าในตารางนี้คืออะไร? หากพวกเขาไม่ใช่คนดั้งเดิมมีอะไรผิดปกติกับ HashMap ฯลฯ ?
Jon Skeet

สำหรับแผนที่ที่มีขนาดใหญ่มากคุณอาจต้องการการนำไปใช้งานการตรวจสอบหรือแม้แต่อินไลน์เหมือนกับตารางฐานข้อมูล
Tom Hawtin - tackline

1
ที่น่าสนใจฉันไม่เห็นการพูดถึงเด็กผู้ชายที่นี่ซึ่งต่อมาได้เข้าร่วมเป็นควาน
smartnut007

4
มันมีค่าที่จะกล่าวถึงห้องสมุดคอลเลกชันที่ดีมาก - คอลเลกชัน GS (github.com/goldmansachs/gs-collections) มันมีเอกสารที่ยอดเยี่ยมและชุดที่ละเอียดของการเปลี่ยนแปลงที่ไม่แน่นอนและไม่เปลี่ยนรูป
Piotr Kochański

คำตอบ:


73

จากการตรวจสอบดูเหมือนว่า Trove เป็นเพียงคลังเก็บสำหรับประเภทดั้งเดิม แต่ไม่เหมือนกับการเพิ่มฟังก์ชั่นการทำงานมากกว่าคอลเลกชันปกติใน JDK

ส่วนตัว (และฉันลำเอียง) ฉันรัก Guava (รวมถึงโครงการ Google Java Collections เดิม) มันทำให้งานต่าง ๆ (รวมถึงคอลเลกชัน) ง่ายขึ้นมากในทางที่มีประสิทธิภาพอย่างน้อยสมเหตุสมผล เนื่องจากการดำเนินการรวบรวมข้อมูลไม่ค่อยก่อให้เกิดปัญหาคอขวดในรหัสของฉัน (จากประสบการณ์ของฉัน) นี่คือ "ดี" กว่า API การรวบรวมซึ่งอาจมีประสิทธิภาพมากกว่า แต่ไม่ได้ทำให้โค้ดของฉันอ่านง่าย

เนื่องจากการซ้อนทับกันระหว่าง Trove และ Guava นั้นเป็นศูนย์ที่ค่อนข้างมากบางทีคุณอาจจะอธิบายให้ชัดเจนว่าคุณกำลังมองหาอะไรจากห้องสมุดรวบรวม


3
@ Andreas: ไม่สามารถพูดได้ฉันเห็นด้วย ไม่ใช่ว่ามันเป็นสถานการณ์ "อย่างใดอย่างหนึ่ง" - ฉันใช้คอลเล็กชันทั่วไป (พร้อมผู้ช่วยเช่นคลาสรายการ) จากนั้นใช้ Iterables และอื่น ๆ เมื่อต้องการ ใช้ความซับซ้อนเฉพาะเมื่อมันช่วยคุณ
Jon Skeet

10
หลังจากอ่านความคิดเห็นของตัวเองหลายเดือนหลังจากใช้ GC อย่างกว้างขวาง - ฉันไม่เห็นด้วยกับความเห็นที่ผ่านมาและเห็นด้วยอย่างเต็มที่กับคุณ ใช้วิธีการ / คลาสผู้ช่วยอย่างกว้างขวางพวกเขาทำให้โค้ดอ่านได้ง่ายขึ้นและปลอดภัยยิ่งขึ้น
Andreas Petersson

1
@Andreas: ขอบคุณสำหรับการกลับมาและพูดว่าดังนั้น - ฉันดีใจที่ได้ยินว่า GJC จะช่วย :)
จอนสกีต

2
Hey, จอน Google Java คอลเลกชันคือตอนนี้ฝรั่ง คุณอาจต้องการอัปเดตโพสต์ของคุณสำหรับการอ้างอิงในอนาคต :)
Artur Czajka

1
ฉันได้ทำงานกับโครงการที่ใช้ข้อมูลจำนวนมากซึ่งคอลเลกชันเป็นคอขวดขนาดใหญ่ Java Collections ไม่มีประสิทธิภาพอย่างมาก (ทั้งหน่วยความจำและความเร็ว) โดยเฉพาะอย่างยิ่งหากเก็บข้อมูลพื้นฐาน
Jay Askren

104

คำถามคือ (ตอนนี้) เกี่ยวกับการจัดเก็บข้อมูลจำนวนมากซึ่งสามารถแสดงโดยใช้ประเภทดั้งเดิมเช่นintในแผนที่ บางคำตอบที่นี่ทำให้เข้าใจผิดในความคิดของฉัน มาดูกันว่าทำไม

ฉันแก้ไขเกณฑ์มาตรฐานจากtroveเพื่อวัดการใช้งานจริงและหน่วยความจำ ฉันยังเพิ่มPCJไปยังเกณฑ์มาตรฐานนี้ซึ่งเป็นอีกหนึ่งคอลเลกชันห้องสมุดสำหรับประเภทดั้งเดิม (ฉันใช้ที่หนึ่งอย่างกว้างขวาง) เกณฑ์มาตรฐาน 'ทางการ' ไม่ได้เปรียบเทียบ IntIntMaps กับ Java Collection ของการMap<Integer, Integer>เก็บIntegersและการจัดเก็บintsอาจไม่เหมือนกันจากมุมมองทางเทคนิค แต่ผู้ใช้อาจไม่ใส่ใจกับรายละเอียดทางเทคนิคนี้เขาต้องการจัดเก็บข้อมูลที่แสดงได้intsอย่างมีประสิทธิภาพ

ก่อนอื่นส่วนที่เกี่ยวข้องของรหัส:

new Operation() {

     private long usedMem() {
        System.gc();
        return Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
     }

     // trove
     public void ours() {
        long mem = usedMem();
        TIntIntHashMap ours = new TIntIntHashMap(SET_SIZE);
        for ( int i = dataset.size(); i-- > 0; ) {
           ours.put(i, i);
        }
        mem = usedMem() - mem;
        System.err.println("trove " + mem + " bytes");
        ours.clear();
     }

     public void pcj() {
        long mem = usedMem();
        IntKeyIntMap map = new IntKeyIntOpenHashMap(SET_SIZE);
        for ( int i = dataset.size(); i-- > 0; ) {
           map.put(i, i);
        }
        mem = usedMem() - mem;
        System.err.println("pcj " + mem + " bytes");
        map.clear();
     }

     // java collections
     public void theirs() {
        long mem = usedMem();
        Map<Integer, Integer> map = new HashMap<Integer, Integer>(SET_SIZE);
        for ( int i = dataset.size(); i-- > 0; ) {
           map.put(i, i);
        }
        mem = usedMem() - mem;
        System.err.println("java " + mem + " bytes");
        map.clear();
     }

ฉันถือว่าข้อมูลมาในรูปแบบดั้งเดิมintsซึ่งดูเหมือนว่ามีเหตุผล แต่สิ่งนี้แสดงถึงการลงโทษแบบรันไทม์สำหรับ java util เนื่องจาก auto-Boxing ซึ่งไม่จำเป็นสำหรับกรอบการรวบรวมแบบดั้งเดิม

ผลลัพธ์รันไทม์ (โดยไม่ต้องgc()เรียกใช้) บน WinXP, jdk1.6.0_10:

                      การดำเนินงานที่ใส่ได้ 100,000 การดำเนินการที่มีอยู่ 100,000 ครั้ง 
คอลเลกชัน java 1938 ms 203 ms
trove 234 ms 125 ms
pcj 516 ms 94 ms

แม้ว่าสิ่งนี้อาจดูรุนแรง แต่นี่ไม่ใช่เหตุผลที่จะใช้เฟรมเวิร์กดังกล่าว

เหตุผลก็คือประสิทธิภาพของหน่วยความจำ ผลลัพธ์ของแผนที่ที่มีintข้อมูล100,000 รายการ:

คอลเลกชัน java จะแกว่งระหว่าง 6644536 ถึง 7168840 ไบต์
trove 1853296 ไบต์
pcj 1866112 ไบต์

Java Collections ต้องการหน่วยความจำมากกว่าสามเท่าเมื่อเทียบกับเฟรมเวิร์กการรวบรวมดั้งเดิม เช่นคุณสามารถเก็บข้อมูลได้มากถึงสามเท่าในหน่วยความจำโดยไม่ต้องหันไปใช้ดิสก์ IO ซึ่งลดประสิทธิภาพการทำงานของรันไทม์ลงตามขนาด และเรื่องนี้ อ่านคะแนนสูงเพื่อหาสาเหตุ

จากประสบการณ์ของฉันการใช้หน่วยความจำสูงเป็นปัญหาด้านประสิทธิภาพที่ใหญ่ที่สุดของ Java ซึ่งแน่นอนว่าส่งผลให้ประสิทธิภาพการทำงานของ runtime แย่ลงด้วยเช่นกัน กรอบการรวบรวมดั้งเดิมสามารถช่วยได้ที่นี่จริงๆ

ดังนั้น: ไม่ java.util ไม่ใช่คำตอบ และ "การเพิ่มฟังก์ชั่นการใช้งาน" ลงในคอลเล็กชัน Java ไม่ใช่ประเด็นเมื่อถามเกี่ยวกับประสิทธิภาพ นอกจากนี้คอลเล็กชั่น JDK ที่ทันสมัยก็ไม่ได้ "ทำผลงานได้ดีแม้แต่คอลเล็กชั่น Trove พิเศษ"

ข้อจำกัดความรับผิดชอบ: มาตรฐานที่นี่อยู่ไกลจากความสมบูรณ์และไม่สมบูรณ์แบบ มันมีความหมายที่จะขับรถกลับบ้านจุดที่ฉันมีประสบการณ์ในหลายโครงการ การรวบรวมดั้งเดิมมีประโยชน์เพียงพอที่จะทนต่อ API คาว - หากคุณทำงานกับข้อมูลจำนวนมาก


3
ที่จริงฉันคิดว่าคำตอบของคุณทำให้เข้าใจผิด การจัดเก็บ ints vs จำนวนเต็มนั้นแตกต่างกันมากและเป็นสาเหตุหลักของการใช้หน่วยความจำที่เพิ่มขึ้น ฉันเห็นด้วยกรอบการรวบรวมประเภท raw อาจมีประโยชน์ แต่ก็ไม่ได้ทำให้ troj หรือ pcj "ดีกว่า" กว่า java.util
Jorn

22
คำถามเกี่ยวกับการจัดเก็บข้อมูล int ได้อย่างมีประสิทธิภาพ ไม่เกี่ยวกับการเก็บจำนวนเต็ม สำหรับภารกิจนี้ trove / pcj นั้นมีประสิทธิภาพมากกว่าอย่างที่ฉันพยายามจะแสดง การใช้ Integers กำหนดรันไทม์และความไร้ประสิทธิภาพของหน่วยความจำ เนื่องจาก java.util ไม่อนุญาตการใช้งานพื้นฐานจึงไม่ใช่ตัวเลือกที่ดีที่สุดสำหรับงานนี้
the.duckman

2
(สำหรับชุมชนชาวรัสเซีย) ที่นี่เป็นมาตรฐานอีกประการหนึ่ง: total-holywar.blogspot.com/2011/07/…
dma_k

ไม่แน่ใจว่าเราไม่ได้ใช้ int เป็นกุญแจหรือไม่นั้นเป็นเพียงสตริงปกติ สิ่งที่จะเป็นผลการปรับแต่งสำหรับพวกเขา?
Clark Bao

@ClarkBao (ขออภัยที่มาสาย) การจัดเก็บวัตถุใด ๆ เนื่องจากคีย์จะใช้วัตถุhashCode()นั้น มันทำให้คุณintเป็นกุญแจสำคัญ
แมททิว

47

ฉันรู้ว่านี่เป็นโพสต์เก่าและมีคำตอบมากมายที่นี่ แต่คำตอบข้างต้นเป็นเพียงผิวเผินและง่ายกว่าในแง่ของการแนะนำห้องสมุด ไม่มีห้องสมุดใดที่สามารถข้ามเกณฑ์มาตรฐานต่าง ๆ ที่นำเสนอได้ที่นี่ ข้อสรุปเดียวที่ฉันได้รับคือถ้าคุณสนใจเกี่ยวกับประสิทธิภาพและความทรงจำและโดยเฉพาะการจัดการกับประเภทดั้งเดิมมันมีค่ามากกว่าการดูทางเลือกที่ไม่ใช่ jdk

นี่คือการวิเคราะห์เสียงที่มากขึ้นในแง่ของกลไกมาตรฐานและห้องสมุดที่ครอบคลุม นี่คือเธรดในรายการ dev mahout

ห้องสมุดที่ครอบคลุมคือ

  • HPPC
  • ขุม
  • FastUtil
  • Mahout (เด็กผู้ชาย)
  • Java Collections

อัปเดตมิถุนายน 2558 : น่าเสียดายที่มาตรฐานเดิมไม่สามารถใช้งานได้อีกต่อไปและนอกเหนือจากความล้าสมัยแล้ว นี่คือการเปรียบเทียบที่เป็นธรรม (ม.ค. 2558) ล่าสุดโดยบุคคลอื่น มันไม่ครอบคลุมและไม่มีเครื่องมือสำรวจเชิงโต้ตอบเช่นเดียวกับลิงก์ดั้งเดิม


1
ขอบคุณ. สิ่งนี้มีประโยชน์มาก .. เมื่อพิจารณาถึงความสำคัญของคำถามมันยากที่จะเชื่อว่าไม่มีคำตอบอื่นใด (นอกเหนือจาก the.duckman) จริง ๆ ตอบคำถามนี้
Dexter

20

ตามที่ผู้แสดงความเห็นคนอื่น ๆ ได้สังเกตเห็นคำจำกัดความของ "ประสิทธิภาพ" จะทำให้เกิดเครือข่ายที่กว้างขวาง อย่างไรก็ตามยังไม่มีใครพูดถึงห้องสมุด Javolutionห้องสมุด

ไฮไลท์บางส่วน:

  • คลาส Javolution นั้นรวดเร็วเร็วมาก (เช่นการแทรก / การลบข้อความใน O [Log (n)] แทน O [n] สำหรับ StringBuffer / StringBuilder มาตรฐาน
  • ชั้นเรียน Javolution ทั้งหมดนั้นใช้งานได้แบบเรียลไทม์และมีพฤติกรรมที่กำหนดไว้สูง นอกจากนี้ (แตกต่างจากไลบรารีมาตรฐาน), Javolution นั้นปลอดภัย RTSJ (ไม่มีการขัดแย้งของหน่วยความจำหรือหน่วยความจำรั่วเมื่อใช้กับส่วนขยาย Java Real-Time)
  • คลาสของคอลเลกชันเรียลไทม์ของ Javolution (แผนที่, รายการ, ตารางและชุด) สามารถใช้แทนคลาสคอลเลกชันมาตรฐานส่วนใหญ่และมีฟังก์ชันเพิ่มเติม
  • คอลเลกชัน Javolution จัดให้มีการรับรองพร้อมกันเพื่อให้การใช้อัลกอริทึมแบบขนานง่าย

การแจกแจง Javolution มีชุดมาตรฐานเพื่อให้คุณสามารถดูว่าชุดข้อมูลเหล่านี้ซ้อนทับกับไลบรารีอื่น / คอลเลกชันในตัวได้อย่างไร


16

บางคอลเล็กชัน libs ที่ต้องพิจารณา:

ฉันจะเข้าถึงไลบรารีคอลเลกชัน JDK ก่อนอื่น ครอบคลุมสิ่งที่พบบ่อยที่สุดที่คุณต้องทำและเห็นได้ชัดว่ามีอยู่แล้วสำหรับคุณ

Google Collections น่าจะเป็นห้องสมุดคุณภาพสูงที่ดีที่สุดนอก JDK มันใช้งานหนักและรองรับได้ดี

Apache Commons Collections เก่ากว่าและทนทุกข์ทรมานจากปัญหา "พ่อครัวมากเกินไป" แต่ก็มีสิ่งที่มีประโยชน์มากมายเช่นกัน

Trove มีคอลเล็กชั่นพิเศษสำหรับกรณีเช่นคีย์ / ค่าดั้งเดิม ทุกวันนี้เราพบว่าใน JDK ที่ทันสมัยและด้วยคอลเลกชัน Java 5+ และกรณีการใช้งานพร้อมกันคอลเลกชัน JDK จะทำงานได้ดีแม้กระทั่งคอลเลกชันพิเศษของ Trove

หากคุณมีกรณีการใช้งานพร้อมกันที่สูงมากคุณควรตรวจสอบสิ่งต่างๆเช่น NonBlockingHashMap ใน lib ระดับสูงซึ่งเป็นการใช้งานแบบไม่ล็อคและสามารถใช้งาน ConcurrentHashMap ได้


7
"ทุกวันนี้เราพบว่าใน JDK ที่ทันสมัยและด้วยคอลเลกชัน Java 5+ และกรณีการใช้งานพร้อมกันคอลเลกชัน JDK จะทำงานได้แม้กระทั่งคอลเล็กชั่นพิเศษ Trove" ความเข้าใจผิด - ฉันไม่เคยเห็น micro-benchmark ที่จัดเก็บ / เรียกค้นประเภทดั้งเดิมในคลาสคอลเลกชันดั้งเดิมแบบพิเศษเช่น Trove ไม่ได้มีประสิทธิภาพสูงกว่าคลาสคอลเลกชัน JDK ทั้งในการใช้หน่วยความจำและเวลา CPU หากคุณกำลังใช้วัตถุ (และไม่ใช่ประเภทพื้นฐาน) ฉันก็จะเห็นด้วยกับอเล็กซ์การหงุดหงิดเรื่องคอลเลกชันไม่ใช่เรื่องใหญ่
Riyad Kalla

2
คำแถลงนี้มีพื้นฐานมาจากการใช้งานในชีวิตจริงที่หนักหน่วง (ซึ่งฉันจะรับหน้าที่เป็นเกณฑ์มาตรฐานขนาดเล็กทุกวัน) ของคอลเล็กชั่นต่าง ๆ ที่เราเคยต้องการคอลเล็กชั่น Trove มาก่อน แต่ตอนนี้สามารถดึงออกมาได้ การปรับปรุง JDK 6 ล่าช้า (ประมาณปลายปี 2009) ได้ให้รหัสที่กำหนดเองสำหรับคีย์แผนที่ทั่วไปเช่น Integer ซึ่งได้ปรับปรุงการใช้งานทั่วไปบางอย่างอย่างมีนัยสำคัญ
Alex Miller

1
อเล็กซ์ฉันไม่สงสัยในกรณีการใช้งานเฉพาะของคุณที่ดึงคอลเลกชันดั้งเดิมและการไปกับคอลเลกชัน JDK นั้นเร็วพอ แต่โบกมือข้ามภูมิประเทศที่เป็นคอลเลกชันและพูดว่า "เจ้าทุกคนที่ผ่านไปมันเร็วพอ! " ไม่ถูกต้อง ถ้าฉันกำลังทำงานกับเอ็นจิ้นเกม 2D ค่าใช้จ่ายในการชกมวย / ไม่ทำกล่องประเภทดั้งเดิมของฉันตลอดเวลานั้นมีราคาแพงมาก ถ้าฉันกำลังทำงานกับ REST API ไม่เช่นนั้นมันอาจจะไม่แตกต่างจากการวัดเลยสำหรับ ops แพงกว่าอย่าง HTTP I / O ฉันรู้สึกว่าถูกบังคับให้ต้องโพสต์จำนวนของคุณทั้งหมด
Riyad Kalla

4
ฉันไม่คิดว่าทุกคนที่อ่านสิ่งนี้ควรฟังเราทั้งคู่ พวกเขาควรทดสอบกรณีการใช้งานของตนเองและดูว่าอะไรมีประสิทธิภาพดีที่สุด ความคิดเห็นของฉันขึ้นอยู่กับการทดสอบประสิทธิภาพที่ค่อนข้างก้าวร้าวของทีมของฉันกับห้องสมุดที่หลากหลาย YMMV
Alex Miller

2
ฉันเห็นด้วยกับ @Riyad ฉันกำลังเขียนชุดออโตมาต้าที่มีประสิทธิภาพสูงและได้นำไปใช้กับทั้ง Trove และ Java Collections Framework (อัพเดตล่าสุด jdk 6) Trove มีประสิทธิภาพสูงกว่าครั้งใหญ่ ในลำดับที่ดีขึ้นเป็นสิบเท่าทั้งในการคำนวณความเร็วและการใช้หน่วยความจำ
Nico Huysamen

6

java.util

ขออภัยสำหรับคำตอบที่ชัดเจน แต่สำหรับการใช้งานส่วนใหญ่Java Collectionsเริ่มต้นนั้นเพียงพอแล้ว


4
สำหรับการใช้งานพื้นฐานใช่ แต่ผมคิดว่ากรอบพลาดคุณลักษณะบางขั้นพื้นฐานและขั้นสูง (เช่นคอลเลกชันที่ไม่เปลี่ยนรูปกรอง multimaps, ฯลฯ ) และว่าที่ (ตัวอย่าง) คอลเลกชันของ Google มาใน
Jorn

1
ฉันคิดว่าคำตอบนี้พลาดจุด JCF นั้นยอดเยี่ยมมากในปี 2002 เมื่อผู้คนไม่ได้ใช้จาวามากนัก น่าเสียดายที่อายุยังไม่ดีโดยเฉพาะเมื่อเปรียบเทียบกับการสนับสนุนคอลเลกชันจากภาษา JVM อื่น ๆ
Ted Pennings

3
-1 คำถามคือ "มีประสิทธิภาพมากที่สุดสำหรับการจัดเก็บ int" และตัวอย่างที่กล่าวมาดีกว่า java.util
kommradHomer

6

หากต้องการจัดเก็บStringแผนที่เป็นล้านๆ ลองดูที่http://code.google.com/p/flatmap


3
+1 คุณช่วยแนะนำวิธีปรับปรุงมันได้หรือไม่
Clark Bao

1
ควรมีการโพสต์บล็อกโดยผู้เขียน flatmap ที่ไหนสักแห่งบนอินเทอร์เน็ต
akuhn


3

ConcurrentHashMap เช่นเดียวกับjava.util.concurrentแพคเกจควรจะกล่าวถึงถ้าคุณวางแผนที่จะใช้ HashMap ในหลายกระทู้ หน่วยความจำขนาดเล็กมีการพิจารณาเนื่องจากเป็นส่วนหนึ่งของจาวามาตรฐาน


3

ขึ้นอยู่กับวิธีที่เรากำหนด "มีประสิทธิภาพ"

โครงสร้างข้อมูลทุกตัวมีพฤติกรรม Big-Oh ของตัวเองสำหรับการอ่านการเขียนการวนซ้ำหน่วยความจำ ฯลฯ รายการที่เชื่อมโยงในไลบรารีหนึ่งมีแนวโน้มที่จะเหมือนกัน และแผนที่แฮชจะเร็วขึ้นสำหรับการอ่าน O (1) กว่ารายการที่เชื่อมโยง O (n)

แต่เมื่อฉันอ่านคำตอบสำหรับคำถาม "ห้องสมุด Java ที่มีประโยชน์มากที่สุดฟรี" ฉันสังเกตเห็นว่าขุมกำลังกล่าวถึงแทบจะไม่

สิ่งนี้ดูเหมือนจะไม่ "มีประสิทธิภาพมากที่สุด" ดูเหมือน "ยอดนิยม" สำหรับฉัน

แค่คำติชมบางอย่าง - ฉันไม่เคยได้ยินและไม่รู้จักใครที่เคยใช้ คอลเล็กชันที่สร้างขึ้นใน JDK, Google หรือ Apache Commons เป็นที่รู้จักกันดีสำหรับฉัน


3

ทรัวมีข้อได้เปรียบเล็กน้อย

  • รอยเท้าหน่วยความจำขนาดเล็กมันไม่ได้ใช้ Map.Entry วัตถุ
  • คุณสามารถใช้กลยุทธ์แฮชแทนปุ่มสำหรับแผนที่ซึ่งจะช่วยประหยัดหน่วยความจำและหมายความว่าคุณไม่จำเป็นต้องกำหนดคีย์ใหม่ทุกครั้งที่คุณต้องการแคชวัตถุในชุดคุณลักษณะใหม่
  • มันมีประเภทคอลเลกชันดั้งเดิม
  • คิดว่ามันมีตัววนซ้ำภายในบางรูปแบบ

ที่กล่าวมามีการดำเนินการหลายอย่างเพื่อปรับปรุงคอลเลกชัน jdk ตั้งแต่เขียนเป็นกอง

มันเป็นกลยุทธ์ที่คร่ำครวญที่ทำให้มันดึงดูดใจฉันแม้ว่า ... Google สำหรับขุมทรัพย์และอ่านภาพรวมของพวกเขา


2

หากคุณต้องการเก็บบันทึกนับล้านในตารางแฮชโอกาสที่คุณจะพบปัญหาหน่วยความจำ เรื่องนี้เกิดขึ้นกับฉันเมื่อฉันพยายามสร้างแผนที่ที่มีวัตถุ String 2.3 ล้านตัวอย่าง ฉันไปกับBerkeleyDBซึ่งเป็นผู้ใหญ่มากและทำงานได้ดี พวกเขามี Java API ที่ล้อมรอบ Collections API ดังนั้นคุณสามารถสร้างแผนที่ขนาดใหญ่โดยพลการด้วยหน่วยความจำน้อยมาก การเข้าถึงจะช้าลง (ตามที่จัดเก็บไว้ในดิสก์)

คำถามติดตามผล : มีห้องสมุดที่ดี (และมีประสิทธิภาพ) ได้รับการดูแลเป็นอย่างดีหรือไม่สำหรับคอลเลกชันที่ไม่เปลี่ยนรูปแบบ? Clojure ได้รับการสนับสนุนอย่างดีเยี่ยมในเรื่องนี้และมันคงจะดีถ้ามีบางอย่างที่คล้ายคลึงกับ Java


1
Google collection เพิ่มคอลเล็กชันที่ไม่เปลี่ยนรูปแบบ
the.duckman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.