Miksi JMH
Vältä naiivit vertailutestien virheet.
Miksi JMH on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Java Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Java Academy-kurssilla on yhteensä 4 oppituntia.
Miksi JMH
Java Microbenchmark Harness (JMH) on vakiotyökalu pienten Java-koodin osien suorituskyvyn mittaamiseen. Itse tehdyt ajoitussilmukat tuottavat lähes aina vääriä tuloksia, koska JVM on kehittynyt optimoiva ajoympäristö.
JMH:n tarkoitus on poistaa nämä sudenkuopat.
Naiivi benchmark
Tyypillisessä ensimmäisessä yrityksessä silmukka ympäröidään kutsulla System.nanoTime(). Ratkaisu näyttää järkevältä, mutta se on mikrobenchmarkien kannalta pahasti virheellinen.
public class Main {
static int compute(int n) { return n * n + 7; }
public static void main(String[] args) {
long start = System.nanoTime();
int sink = 0;
for (int i = 0; i < 1_000_000; i++) sink = compute(i);
long elapsed = System.nanoTime() - start;
System.out.println("ns: " + elapsed + " sink=" + sink);
}
}Ongelma 1: JIT-lämmitys
JVM aloittaa tulkatussa tilassa ja kääntää kuormitetut metodit natiivikoodiksi vasta tuhansien kutsujen jälkeen. Naiivi benchmark mittaa hidasta tulkattua vaihetta yhdessä nopean käännetyn vaiheen kanssa, joten keskiarvot ovat merkityksettömiä.
JMH ratkaisee tämän erillisellä lämmitysvaiheella, jonka tulokset hylätään.
Ongelma 2: Kuolleen koodin eliminointi
Jos laskettua tulosta ei koskaan käytetä, JIT voi poistaa koko laskutoimituksen. Tällöin benchmark mittaa tyhjää silmukkaa.
JMH tarjoaa palautusarvon kulutuksen ja Blackhole-olion tämän estämiseksi.
Ongelma 3: Vakioiden esilaskenta
Jos syötteet ovat käännösaikaisia vakioita, JIT laskee vastauksen kerran ja käyttää sitä uudelleen. Alla kääntäjä voisi korvata koko silmukan yhdellä vakiolla.
JMH käyttää @State-olioita, jotta optimoija ei näe syötteiden sisältöä.
public class Main {
public static void main(String[] args) {
// 2 * 21 is constant; the JIT folds it to 42
int result = 2 * 21;
System.out.println(result);
}
}Ongelma 4: Silmukkaoptimoinnit
JIT purkaa silmukoita, siirtää muuttumattoman koodin silmukan ulkopuolelle ja vektoroi operaatioita. Itse kirjoitettu silmukka mittaa tällöin näitä optimointeja, ei sitä operaatiota, jonka halusitte testata.
JMH korvaa silmukkanne itse hallinnoimillaan tarkasti kontrolloiduilla iteraatiomäärillä.
Ongelma 5: On-stack replacement
main-metodissa pitkään suoritettava silmukka voidaan kääntää suorituksen aikana (on-stack replacement), jolloin sen suorituskyky poikkeaa normaalisti käännetyn metodin suorituskyvystä. Tämä vääristää tuloksia ennakoimattomasti.
Mitä JMH tarjoaa
- Erilliset, hylättävät lämmitysiteraatiot.
- Useita mittausiteraatioita tilastotietoineen.
- Suorituksen käynnistäminen uusissa JVM-prosesseissa profiilien sekoittumisen välttämiseksi.
- Blackhole ja tulosten kulutus kuolleen koodin eliminointia vastaan.
- @State-oliot vakioiden esilaskennan estämiseksi.
Näin suoritat sen
JMH on erillinen riippuvuus (org.openjdk.jmh), ja se käynnistetään yleensä annotaatio-prosessorin sekä Maven- tai Gradle-koontiprosessin avulla. Koontiprosessi tuottaa suoritettavan JAR-tiedoston. Benchmarkeja ei suoriteta tavallisesta main-metodista muun koodin tapaan.
Tilastoilla on merkitystä
JMH raportoi keskiarvon lisäksi iteraatioiden ja forkkausten välisen virheen / luottamusvälin. Tulos 42.0 +/- 1.3 ns/op kertoo sekä keskeisen arvon että vaihtelun määrän — tämä on olennaista mittaustuloksen luotettavuuden arvioinnissa.
Milloin JMH kannattaa ottaa käyttöön
Käyttäkää JMH:ta, kun vertaatte kahta toteutusta kuumassa koodipolussa, varmistatte optimoinnin vaikutuksen tai mittaatte nanosekunti–mikrosekuntitasolla suoritettavia operaatioita. Karkeaan, sekunteja kestävään työhön, kuten I/O-operaatioihin tai verkkoliikenteeseen, seinäkelloaikaan perustuva mittaus on yleensä riittävä.
Pikatarkistus
Testatkaa, kuinka hyvin ymmärrätte, miksi JMH:ta tarvitaan.
Kertaus
Opitte, miksi mikrobenchmarkit tarvitsevat mittauskehyksen:
- JVM lämpenee: tulkattu koodi muuttuu käännetyksi vasta monien kutsujen jälkeen.
- Kuolleen koodin eliminointi ja vakioiden esilaskenta voivat poistaa työnne tai laskea sen etukäteen.
- Silmukkaoptimoinnit ja on-stack replacement vääristävät itse kirjoitettujen silmukoiden tuloksia.
- JMH lisää lämmitys- ja mittausiteraatiot, forkkaamisen, Blackholen ja tilastot.
- Käyttäkää sitä nanosekuntitason kuumien koodipolkujen mittaamiseen.
Opi Java tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 104
- Oppitunnit
- 374
Usein kysytyt kysymykset
Onko oppitunti ”Miksi JMH” ilmainen?
Kyllä – oppitunnin ”Miksi JMH” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Java Academy-kurssin, päivitä CoddyKit PROhon. Java Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Miksi JMH”?
Vältä naiivit vertailutestien virheet. Harjoittelet Java Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Java Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Java Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.
Kuinka kauan ”Miksi JMH”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Java Academy-oppitunnilla?
Kyllä. Jokainen Java Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.