מדוד את הזמן שחלף בג'אווה

1. סקירה כללית

במאמר זה, נבחן כיצד למדוד את הזמן שחלף ב- Java. למרות שזה אולי נשמע קל, יש כמה מלכודות שעלינו להיות מודעים להן.

נחקור שיעורי Java סטנדרטיים וחבילות חיצוניות המספקות פונקציונליות למדידת הזמן שחלף.

2. מדידות פשוטות

2.1. currentTimeMillis ()

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

התחלה ארוכה = System.currentTimeMillis (); // ... גימור ארוך = System.currentTimeMillis (); long timeElapsed = סיום - התחל;

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

למרות זאת, התוצאה עשויה ותהיה לא מדויקת כמו System.currentTimeMillis () אמצעים שעון קיר זְמַן. זמן שעון הקיר עשוי להשתנות מסיבות רבות, למשל. שינוי זמן המערכת יכול להשפיע על התוצאות או שנייה מעוברת תשבש את התוצאה.

2.2. nanoTime ()

שיטה נוספת ב מערכת java.lang הכיתה היא nanoTime (). אם נסתכל על תיעוד Java, נגלה את ההצהרה הבאה:

"ניתן להשתמש בשיטה זו רק למדידת הזמן שחלף ואינה קשורה לשום תפיסה אחרת של זמן המערכת או שעון הקיר."

בואו נשתמש בזה:

התחלה ארוכה = System.nanoTime (); // ... גימור ארוך = System.nanoTime (); long timeElapsed = סיום - התחל;

הקוד בעצם זהה לקודם. ההבדל היחיד הוא השיטה בה משתמשים לקבל חותמות זמן - nanoTime () במקום currentTimeMillis ().

בואו נציין זאת nanoTime (), כמובן, מחזיר זמן בננו-שניות. לכן, אם הזמן שעבר נמדד ביחידת זמן אחרת עלינו להמיר אותו בהתאם.

לדוגמא, כדי להמיר לאלפיות השנייה עלינו לחלק את התוצאה לננו-שניות ב 1.000.000.

מלכודת נוספת עם nanoTime () האם זה למרות שהוא מספק דיוק ננו-שנייה, הוא אינו מבטיח רזולוציה של ננו-שנייה (כלומר באיזו תדירות עדכון הערך).

עם זאת, זה כן מבטיח שההחלטה תהיה טובה לפחות כמו זו של currentTimeMillis ().

3. ג'אווה 8

אם אנו משתמשים ב- Java 8 - אנו יכולים לנסות את החדש java.time. מיידי ו java.time. משך זמן שיעורים. שניהם בלתי ניתנים לשינוי, בטוחים בחוטים ומשתמשים בסולם הזמן שלהם, ה- סולם הזמן של Java, כמו גם כל השיעורים בתוך החדש java.time ממשק API.

3.1. סולם הזמן של Java

הדרך המסורתית למדוד זמן היא לחלק יום ל 24 שעות של 60 דקות של 60 שניות, מה שנותן 86.400 שניות ביום. עם זאת, ימי שמש אינם תמיד ארוכים באותה מידה.

סולם הזמן של UTC מאפשר למעשה ליום להיות 86.399 או 86.401 שניות SI. שנייה של SI היא "שנייה בינלאומית סטנדרטית" מדעית ומוגדרת על ידי תקופות קרינה של אטום צזיום 133). זה נדרש כדי לשמור על יום מיושר עם השמש.

סולם הזמן של ג'אווה מתחלק בכל יום קלנדרי ל -86.400 חלוקות משנה, המכונות שניות. אין שניות קפיצה.

3.2. רֶגַע מעמד

ה רֶגַע class מייצג רגע על ציר הזמן. בעיקרון, זהו חותמת זמן מספרית מאז תקופת Java הסטנדרטית של 1970-01-01T00: 00: 00Z.

על מנת לקבל את חותמת הזמן הנוכחית, אנו יכולים להשתמש ב- Instant.now () שיטה סטטית. שיטה זו מאפשרת העברה של אופציונלי שָׁעוֹן פָּרָמֶטֶר. אם הוא מושמט, הוא משתמש בשעון המערכת באזור הזמן המוגדר כברירת מחדל.

אנו יכולים לאחסן זמני התחלה וסיום בשני משתנים, כמו בדוגמאות הקודמות. בשלב הבא נוכל לחשב את הזמן שחלף בין שני הרגעים.

אנו יכולים גם להשתמש ב- מֶשֶׁך בכיתה וזה בֵּין() שיטה להשגת משך הזמן בין שניים רֶגַע חפצים. לבסוף, עלינו להמיר מֶשֶׁך למילישניות:

התחלה מיידית = Instant.now (); // CODE HERE סיום מיידי = Instant.now (); long timeElapsed = Duration.between (התחלה, סיום) .toMillis ();

4. סטוֹפֶּר

במעבר לספריות, Apache Commons Lang מספק את סטוֹפֶּר בכיתה שניתן להשתמש בה כדי למדוד את הזמן שחלף.

4.1. תלות של Maven

אנו יכולים לקבל את הגרסה האחרונה על ידי עדכון ה- pom.xml:

 org.apache.commons commons-lang3 3.7 

ניתן לבדוק כאן את הגרסה האחרונה של התלות.

4.2. מדידת הזמן שחלף עם סטוֹפֶּר

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

שעון סטופר = שעון עצר חדש (); watch.start ();

ברגע שיש לנו שעון פועל, נוכל לבצע את הקוד שאנו רוצים להוות אמת מידה ואז בסוף, אנחנו פשוט קוראים תפסיק() שיטה. לבסוף, כדי לקבל את התוצאה בפועל, אנו מתקשרים getTime ():

watch.stop (); System.out.println ("הזמן שחלף:" + watch.getTime ()); // הדפסים: זמן שחלף: 2501

סטוֹפֶּר יש כמה שיטות עוזרות נוספות בהן נוכל להשתמש כדי להשהות או לחדש את המדידה שלנו. זה עשוי להיות מועיל אם נצטרך להפוך את המדד שלנו למורכב יותר.

לסיום, נציין שהשיעור אינו בטוח בחוטים.

5. מסקנה

ישנן דרכים רבות למדוד זמן ב- Java. סקרנו דרך מאוד "מסורתית" (ולא מדויקת) currentTimeMillis (). בנוסף בדקנו את Apache Common סטוֹפֶּר ובחן את השיעורים החדשים הקיימים ב- Java 8.

בסך הכל, למדידות פשוטות ונכונות של הזמן שחלף, nanoTime () השיטה מספיקה. זה גם קצר יותר להקליד מאשר currentTimeMillis ().

עם זאת, נציין כי לצורך ביצוע ביצועים נכון של benchmarking, במקום למדוד זמן באופן ידני, אנו יכולים להשתמש במסגרת כמו רתמת Java Microbenchmark (JMH). נושא זה חורג מהיקף המאמר אך בחנו אותו כאן.

לבסוף, כמו תמיד, ניתן למצוא את הקוד ששימש במהלך הדיון ב- GitHub.


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