Merajte uplynulý čas v prostredí Java

1. Prehľad

V tomto článku sa pozrieme na to, ako merať uplynulý čas v prostredí Java. Aj keď to môže znieť ľahko, existuje niekoľko nástrah, ktoré si musíme uvedomiť.

Preskúmame štandardné triedy Java a externé balíčky, ktoré poskytujú funkcie na meranie uplynulého času.

2. Jednoduché merania

2.1. currentTimeMillis ()

Keď narazíme na požiadavku na meranie uplynutého času v Jave, môžeme to skúsiť urobiť takto:

dlhý štart = System.currentTimeMillis (); // ... long finish = System.currentTimeMillis (); long timeElapsed = cieľ - štart;

Ak sa pozrieme na kód, má to dokonalý zmysel. Na začiatku dostaneme časovú pečiatku a po dokončení kódu dostaneme ďalšiu časovú pečiatku. Uplynutý čas je rozdiel medzi týmito dvoma hodnotami.

Avšak výsledok môže a bude nepresný, pretože System.currentTimeMillis () Opatrenia nástenné hodiny čas. Čas nástenných hodín sa môže meniť z mnohých dôvodov, napr. zmena systémového času môže ovplyvniť výsledky alebo prestávka spôsobí narušenie výsledku.

2.2. nanoTime ()

Ďalšia metóda v java.lang.System trieda je nanoTime (). Ak sa pozrieme do dokumentácie Java, nájdeme nasledujúce vyhlásenie:

"Túto metódu je možné použiť iba na meranie uplynulého času a nesúvisí s nijakým iným poňatím systému alebo času nástenných hodín."

Využime to:

dlhý štart = System.nanoTime (); // ... long finish = System.nanoTime (); long timeElapsed = cieľ - štart;

Kód je v podstate rovnaký ako predtým. Jediným rozdielom je metóda použitá na získanie časových značiek - nanoTime () namiesto currentTimeMillis ().

Poznamenajme to tiež nanoTime (), samozrejme, vracia čas v nanosekundách. Preto, ak sa uplynulý čas meria v inej časovej jednotke, musíme ho príslušne prepočítať.

Napríklad na prevod na milisekundy musíme vydeliť výsledok v nanosekundách o 1 000 000.

Ďalšia nástraha s nanoTime () je to tak aj keď poskytuje presnosť nanosekúnd, nezaručuje rozlíšenie nanosekúnd (t. j. ako často sa hodnota aktualizuje).

Zaručuje však, že rozlíšenie bude minimálne také dobré ako rozlíšenie currentTimeMillis ().

3. Java 8

Ak používame Java 8 - môžeme vyskúšať nový java.time.Instant a java.time.Duration triedy. Oba sú nemenné, bezpečné pre vlákna a používajú svoj vlastný časový rozsah, Časová škála Java, tak ako všetky triedy v rámci nového java.time API.

3.1. Časová škála Java

Tradičným spôsobom merania času je rozdelenie dňa na 24 hodín, 60 minút a 60 sekúnd, čo dáva 86 400 sekúnd denne. Nie vždy sú však slnečné dni rovnako dlhé.

Časová mierka UTC v skutočnosti umožňuje, aby mal deň 86 399 alebo 86 401 SI sekúnd. Sekunda SI je vedecká „Štandardná medzinárodná sekunda“ a je definovaná obdobiami žiarenia atómu cézia 133). To je potrebné na to, aby bol deň vyrovnaný so Slnkom.

Časová škála Java rozdeľuje každý kalendárny deň na presne 86 400 čiastkových divízií, ktoré sa označujú ako sekundy. Nie sú žiadne skokové sekundy.

3.2. Okamžité Trieda

The Okamžité trieda predstavuje okamih na časovej osi. V zásade je to číselná časová značka od štandardnej epochy Java z 1970-01-01T00: 00: 00Z.

Na získanie aktuálnej časovej pečiatky môžeme použiť Okamžité. Teraz () statická metóda. Táto metóda umožňuje odovzdanie voliteľnej položky Hodiny parameter. Ak je vynechané, použije systémové hodiny v predvolenom časovom pásme.

Počiatočný a konečný čas môžeme uložiť do dvoch premenných, ako v predchádzajúcich príkladoch. Ďalej môžeme vypočítať čas, ktorý uplynul medzi obidvomi okamihmi.

Môžeme dodatočne použiť Trvanie trieda a je medzi () metóda na získanie trvania medzi dvoma Okamžité predmety. Nakoniec musíme previesť Trvanie do milisekúnd:

Okamžitý štart = Instant.now (); // KÓD SEM Okamžité dokončenie = Instant.now (); long timeElapsed = Duration.b Between (start, finish) .toMillis ();

4. Stopky

Apache Commons Lang poskytuje knižnice a poskytuje knižnicu Stopky triedy, ktorú je možné použiť na meranie uplynulého času.

4.1. Maven závislosť

Najnovšiu verziu môžeme získať aktualizáciou pom.xml:

 org.apache.commons commons-lang3 3.7 

Najnovšiu verziu závislosti si môžete skontrolovať tu.

4.2. Meranie uplynulého času pomocou Stopky

Najskôr musíme získať inštanciu triedy a potom môžeme jednoducho zmerať uplynulý čas:

Stopky hodinky = nové Stopky (); watch.start ();

Keď máme hodinky spustené, môžeme vykonať kód, ktorý chceme porovnať, a potom na konci jednoducho zavoláme stop () metóda. Nakoniec, aby sme dosiahli skutočný výsledok, zavoláme getTime ():

watch.stop (); System.out.println ("Uplynulý čas:" + watch.getTime ()); // Tlače: Uplynutý čas: 2501

Stopky má niekoľko ďalších pomocných metód, ktoré môžeme použiť na pozastavenie alebo obnovenie merania. To môže byť užitočné, ak potrebujeme, aby sa náš štandard stal zložitejším.

Na záver si uvedomme, že trieda nie je bezpečná pre vlákna.

5. Záver

Existuje veľa spôsobov, ako merať čas v Jave. Používaním sme pokryli veľmi „tradičný“ (a nepresný) spôsob currentTimeMillis (). Ďalej sme skontrolovali Apache Common Stopky a pozreli sme sa na nové triedy dostupné v prostredí Java 8.

Celkovo pre jednoduché a správne meranie uplynulého času platí: nanoTime () metóda postačuje. Je tiež kratší na písanie ako currentTimeMillis ().

Upozorňujeme však, že pre správne testovanie môžeme namiesto manuálneho merania času použiť rámec ako Java Microbenchmark Harness (JMH). Táto téma presahuje rámec tohto článku, ale tu sme ju preskúmali.

Nakoniec, ako vždy, kód použitý počas diskusie nájdete na GitHub.


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