מדריך FastUtil

1. הקדמה

במדריך זה נבחן את ה- FastUtil סִפְרִיָה.

ראשית, נקודד כמה דוגמאות לכך אוספים ספציפיים.

לאחר מכן ננתח את ביצועים שנותנים FastUtil שמו.

לסיום, בואו נציץ ב FastUtilשל BigArray כלי עזר.

2. תכונות

ה FastUtil ספריית Java מבקשת להרחיב את Framework Java Collections Framework. זה מספק מפות ספציפיות, סטים, רשימות ותורים ספציפיים עם טביעת רגל זיכרון קטנה יותר וגישה מהירה והכנסה מהירה. FastUtil מספק גם סט של כלי עבודה לעבודה עם מערכים, סטים ורשימות גדולים (64 סיביות) גדולים וטיפול בהם.

הספרייה כוללת גם א מספר רב של שיעורי קלט / פלט מעשיים לקבצי בינארי וטקסט.

המהדורה האחרונה שלה, FastUtil 8, שיחרר גם שורה של פונקציות ספציפיות לסוג, והרחיב את ה- JDK ממשקים פונקציונליים.

2.1. מְהִירוּת

במקרים רבים, FastUtil היישומים הם המהירים ביותר שיש. המחברים אף סיפקו דוח אמת מידה מעמיק משלהם והשוואה בין ספריות דומות HPPC ו טרוב.

במדריך זה נבחן את הגדרת המדדים שלנו באמצעות רתמת Java Microbench (JMH).

3. תלות בגודל מלא

נוסף על הרגיל JUnit תלות, נשתמש ב- FastUtils ו JMH תלות במדריך זה.

נצטרך את התלות הבאה שלנו pom.xml קוֹבֶץ:

 it.unimi.dsi fastutil 8.2.2 org.openjdk.jmh jmh-core 1.19 test org.openjdk.jmh jmh-generator-annprocess 1.19 test 

או עבור משתמשי Gradle:

testCompile group: 'org.openjdk.jmh', שם: 'jmh-core', גרסה: '1.19' testCompile group: 'org.openjdk.jmh', שם: 'jmh-generator-annprocess', גרסה: '1.19' קבוצת הידור: 'it.unimi.dsi', שם: 'fastutil', גרסה: '8.2.2'

3.1. קובץ צנצנת מותאם אישית

בגלל היעדר גנריות, FastUtils מייצר מספר רב של כיתות ספציפיות לסוג. ולמרבה הצער, זה מוביל לא קובץ צנצנת ענק.

עם זאת, למזלנו, FastUtils כולל א find-deps.sh סקריפט המאפשר ייצור צנצנות קטנות וממוקדות יותר המורכב רק מהשיעורים שאנו רוצים להשתמש ביישום שלנו.

4. אוספים ספציפיים לסוג

לפני שנתחיל, בואו נסתכל במהירות על התהליך הפשוט של יצירת אוסף ספציפי לסוג. בוא נבחר א מפת גיבוב המאחסן מפתחות וערכים באמצעות זוגות.

למטרה זו, FastUtils מספק Double2DoubleMap ממשק ו Double2DoubleOpenHashMap יישום:

Double2DoubleMap d2dMap = Double2DoubleOpenHashMap חדש ();

כעת, לאחר שמיצבנו את המעמד שלנו, אנו יכולים פשוט לאכלס נתונים כפי שהיינו עושים עם כל אחד מהם מַפָּה מממשק ה- API של Java Collections:

d2dMap.put (2.0, 5.5); d2dMap.put (3.0, 6.6);

לבסוף, אנו יכולים לבדוק שהנתונים נוספו כהלכה:

assertEquals (5.5, d2dMap.get (2.0));

4.1. ביצועים

FastUtils מתמקד ביישומים הביצועיים שלו. בחלק זה נשתמש ב- JMH כדי לאמת עובדה זו. בואו נשווה את אוספי Java HashSet יישום נגד FastUtil's IntOpenHashSet.

ראשית, בואו נראה כיצד ליישם את IntOpenHashSet:

@Param ({"100", "1000", "10000", "100000"}) public int setSize; @Benchmark ציבורי IntSet givenFastUtilsIntSetWithInitialSizeSet_whenPopulated_checkTimeTaken () {IntSet intSet = חדש IntOpenHashSet (setSize); עבור (int i = 0; i <setSize; i ++) {intSet.add (i); } להחזיר intSet; }

למעלה, פשוט הכרזנו על IntOpenHashSet יישום ה- IntSet מִמְשָׁק. הכרזנו גם על הגודל ההתחלתי setSize עם ה @ פארם ביאור.

במילים פשוטות, המספרים האלו מוזנים ל- JMH כדי לייצר סדרת מבחני ביצועים בגדלים שונים.

הַבָּא, בואו נעשה את אותו הדבר באמצעות יישום אוספי Java:

@Benchmark קבע קבוצה givenCollectionsHashSetWithInitialSizeSet_whenPopulated_checkTimeTaken () {Set intSet = חדש HashSet (setSize); עבור (int i = 0; i <setSize; i ++) {intSet.add (i); } להחזיר intSet; }

לבסוף, בואו ננהל את אמת המידה ונשווה בין שתי היישומים:

Benchmark (setSize) Mode Cnt Score Units givenCollectionsHashSetWithInitialSizeSet ​​... 100 avgt 2 1.460 us / op givenCollectionsHashSetWitInitialSizeSet ​​... 1000 avgt 2 12.740 us / op givenCollectionsHashSetWithInitialSizeSet ​​... 10000 avgt 2 109.80 / op givenFastUtilsIntSetWithInitialSizeSet ​​... 100 avgt 2 0.369 us / op givenFastUtilsIntSetWithInitialSizeSet ​​... 1000 avgt 2 2.351 us / op givenFastUtilsIntSetWithInitialSizeSet ​​... 10000 avgt 2 37.789 us / op givenFastSupport

תוצאות אלו מבהירות אתFastUtils היישום הוא הרבה יותר ביצועי מאשר חלופת אוספי Java.

5. אוספים גדולים

חשוב נוסף תכונה של פאstUtils היא היכולת להשתמש במערכי 64 סיביות. מערכים ב- Java, כברירת מחדל, מוגבלים ל -32 ביט.

כדי להתחיל, בואו נסתכל על ה- BigArrays כיתה עבור מספר שלם סוגים. IntBigArrays מספק שיטות סטטיות לעבודה עם דו מימד מספר שלם מערכים. על ידי שימוש בשיטות המסופקות הללו, אנו יכולים למעשה לעטוף את המערך שלנו למערך חד מימדי ידידותי יותר.

בואו נסתכל איך זה עובד.

ראשית, נתחיל באתחול מערך חד מימדי והפיכתו למערך דו מימדי באמצעות העטיפה של IntBigArray שיטה:

int [] oneDArray = int int [] {2, 1, 5, 2, 1, 7}; int [] [] twoDArray = IntBigArrays.wrap (oneDArray.clone ());

אנחנו צריכים הקפד להשתמש ב- שיבוט שיטה כדי להבטיח עותק עמוק של המערך.

עכשיו, כמו שעשינו עם א רשימה או א מַפָּה, אנו יכולים לקבל גישה לאלמנטים באמצעות ה- לקבל שיטה:

int firstIndex = IntBigArrays.get (twoDArray, 0); int lastIndex = IntBigArrays.get (twoDArray, IntBigArrays.length (twoDArray) -1);

לבסוף, בואו נוסיף כמה בדיקות כדי להבטיח את שלנו IntBigArray מחזירה את הערכים הנכונים:

assertEquals (2, firstIndex); assertEquals (7, lastIndex);

6. מסקנה

במאמר זה לקחנו א לצלול לתוך FastUtils תכונות הליבה.

הסתכלנו על חלק מה- אוספים ספציפיים לסוגיהם FastUtil מציע לפני שתשחק עם כמה BigCollections.

כמו תמיד, ניתן למצוא את הקוד ב- GitHub


$config[zx-auto] not found$config[zx-overlay] not found