Izmjerite proteklo vrijeme na Javi

1. Pregled

U ovom ćemo članku pogledati kako izmjeriti proteklo vrijeme u Javi. Iako ovo možda zvuči lako, mora postojati nekoliko zamki kojih moramo biti svjesni.

Istražit ćemo standardne Java klase i vanjske pakete koji pružaju funkcionalnost za mjerenje proteklog vremena.

2. Jednostavna mjerenja

2.1. currentTimeMillis ()

Kada naiđemo na zahtjev za mjerenje proteklog vremena u Javi, možemo to pokušati učiniti na sljedeći način:

dugi početak = System.currentTimeMillis (); // ... duga završnica = System.currentTimeMillis (); long timeElapsed = završetak - početak;

Ako pogledamo kod, to ima sasvim smisla. Dobivamo vremensku oznaku na početku, a drugu vremensku oznaku dobivamo kada je kôd završen. Proteklo vrijeme je razlika između ove dvije vrijednosti.

Međutim, rezultat može i bit će netočan kao System.currentTimeMillis () mjere zidni sat vrijeme. Vrijeme zidnog sata može se promijeniti iz mnogih razloga, npr. promjena vremena sustava može utjecati na rezultate ili će prijestupna sekunda poremetiti rezultat.

2.2. nanoTime ()

Druga metoda u java.lang.Sustav razred je nanoTime (). Ako pogledamo Java dokumentaciju, naći ćemo sljedeću izjavu:

"Ova se metoda može koristiti samo za mjerenje proteklog vremena i nije povezana s bilo kojim drugim pojmom sustava ili vremena zidnog sata."

Iskoristimo ga:

dugi početak = System.nanoTime (); // ... dugo završiti = System.nanoTime (); long timeElapsed = završetak - početak;

Kôd je u osnovi isti kao i prije. Jedina razlika je metoda koja se koristi za dobivanje vremenskih žigova - nanoTime () umjesto currentTimeMillis ().

Napomenimo i to nanoTime (), očito, vraća vrijeme u nanosekundama. Stoga, ako se proteklo vrijeme mjeri u drugoj vremenskoj jedinici, moramo ga pretvoriti u skladu s tim.

Na primjer, da bismo pretvorili u milisekunde moramo rezultat podijeliti u nanosekundama s 1.000.000.

Još jedna zamka s nanoTime () je li to iako pruža nanosekundnu preciznost, ne garantira nanosekundnu razlučivost (tj. koliko se često vrijednost ažurira).

Međutim, jamči da će razlučivost biti barem jednako dobra kao i currentTimeMillis ().

3. Java 8

Ako koristimo Javu 8 - možemo isprobati novo java.time.Instant i java.time.Trajanje razreda. Oboje su nepromjenjivi, zaštićeni nitima i koriste svoju vremensku skalu Java vremenska skala, kao i svi razredi unutar novog java.vrijeme API.

3.1. Java-skala vremena

Tradicionalni način mjerenja vremena je dijeljenje dana na 24 sata od 60 minuta od 60 sekundi, što daje 86.400 sekundi dnevno. Međutim, sunčani dani nisu uvijek jednako dugi.

UTC vremenska skala zapravo omogućuje danu da ima 86.399 ili 86.401 SI sekundi. SI sekunda je znanstvena „standardna međunarodna sekunda“ i definirana je razdobljima zračenja atoma cezija 133). To je potrebno da se dan uskladi sa Suncem.

Vremenska skala Java dijeli svaki kalendarski dan na točno 86.400 pododjela, poznatih kao sekunde. Nema prijestupnih sekundi.

3.2. Trenutak Razred

The Trenutak razred predstavlja trenutak na vremenskoj traci. U osnovi, to je numerička vremenska oznaka od standardne Java ere od 1970-01-01T00: 00: 00Z.

Da bismo dobili trenutnu vremensku oznaku, možemo koristiti Instant.now () statička metoda. Ova metoda omogućuje predavanje neobavezno Sat parametar. Ako je izostavljeno, koristi sistemski sat u zadanoj vremenskoj zoni.

Vremena početka i završetka možemo pohraniti u dvije varijable, kao u prethodnim primjerima. Dalje, možemo izračunati vrijeme proteklo između oba trenutka.

Možemo dodatno koristiti Trajanje razred i to je između() metoda za dobivanje trajanja između dva Trenutak predmeta. Napokon, moramo se obratiti Trajanje u milisekunde:

Trenutni početak = Instant.now (); // KODIRAJ OVDJE Trenutni završetak = Instant.now (); long timeElapsed = Trajanje.između (početak, završetak) .toMillis ();

4. Štoperica

Prelazeći na knjižnice, Apache Commons Lang nudi Štoperica razred koji se može koristiti za mjerenje proteklog vremena.

4.1. Ovisnost Mavena

Ažuriranjem pom.xml možemo dobiti najnoviju verziju:

 org.apache.commons commons-lang3 3.7 

Najnoviju verziju ovisnosti možete provjeriti ovdje.

4.2. Mjerenje proteklog vremena sa Štoperica

Prije svega, moramo dobiti primjerak klase, a zatim možemo jednostavno izmjeriti proteklo vrijeme:

Štoperica = nova štoperica (); watch.start ();

Nakon što pokrenemo sat, možemo izvršiti kod koji želimo usporediti i na kraju jednostavno zovemo Stop() metoda. Konačno, da bismo dobili stvarni rezultat, zovemo getTime ():

watch.stop (); System.out.println ("Vrijeme proteklo:" + watch.getTime ()); // Ispisi: proteklo vrijeme: 2501

Štoperica ima nekoliko dodatnih pomoćnih metoda koje možemo koristiti kako bismo zaustavili ili nastavili mjerenje. Ovo bi moglo biti korisno ako moramo napraviti mjerilo složenijim.

Na kraju, napomenimo da klasa nije zaštićena od niti.

5. Zaključak

Na Javi postoji mnogo načina za mjerenje vremena. Koristili smo vrlo "tradicionalan" (i netočan) način currentTimeMillis (). Pored toga, provjerili smo Apache Common's Štoperica i pogledali nove klase dostupne u Javi 8.

Sveukupno, za jednostavna i točna mjerenja proteklog vremena, nanoTime () metoda je dovoljna. Također je kraće upisivati ​​od currentTimeMillis ().

No, imajmo na umu da za pravilno uspoređivanje, umjesto ručnog mjerenja vremena, možemo koristiti okvir poput Java Microbenchmark Harness (JMH). Ova tema nadilazi opseg ovog članka, ali mi smo je ovdje istražili.

Napokon, kao i uvijek, kod korišten tijekom rasprave možete pronaći na GitHubu.