Vertailutestin kirjoittaminen
@Benchmark ja tilat.
Vertailutestin kirjoittaminen on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/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.
Benchmarkin kirjoittaminen
JMH-benchmark on yksinkertaisesti metodi, joka on merkitty annotaatiolla @Benchmark tavallisessa luokassa. JMH:n annotaatioprosessori luo sen ympärille mittauskehyksen. Tässä oppitunnissa käsitellään annotaatioita, joilla määritetään, mitä ja miten mitataan.
Annotaatio <code>@Benchmark</code>
Merkitkää mikä tahansa julkinen metodi annotaatiolla @Benchmark, niin JMH kutsuu sitä toistuvasti ja mittaa jokaisen kutsun keston. Metodin palautusarvo tulee palauttaa, ei hävittää, jotta JMH voi kuluttaa sen.
Benchmark-luokan vähimmäisrakenne
Tässä on benchmarkin rakenne. Tuonti on org.openjdk.jmh.annotations.*. Koska JMH ei ole tämän suoritusympäristön luokkatiellä, esimerkki on vain havainnollistava.
import org.openjdk.jmh.annotations.Benchmark;
public class StringBench {
@Benchmark
public String concat() {
return "foo" + System.nanoTime();
}
}Benchmarkin tilat
@BenchmarkMode määrittää, mitä raportoidaan:
- Throughput — operaatioita aikayksikköä kohti (suurempi on parempi).
- AverageTime — aikaa operaatiota kohti (pienempi on parempi).
- SampleTime — aikojen jakauma (persentiilit).
- SingleShotTime — yksi kutsu, sopii kylmäkäynnistyksen mittaamiseen.
import org.openjdk.jmh.annotations.*;
public class Bench {
@Benchmark
@BenchmarkMode(Mode.AverageTime)
public int work() {
return 2 + 2;
}
}Tulostusyksiköiden valinta
@OutputTimeUnit määrittää raportin aikayksikön, jotta luvut ovat helposti luettavia. Nopealle operaatiolle nanosekunnit ovat järkevä valinta, hitaalle millisekunnit.
import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.*;
public class Bench {
@Benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public int work() {
return 42;
}
}Tulosten palauttaminen
Palauttakaa aina työn tulos. JMH syöttää palautetut arvot automaattisesti Blackholelle, mikä estää kuolleen koodin eliminoinnin. void-benchmark, joka laskee tuloksen ja hävittää sen, on klassinen virhe.
Annotaatioiden oletukset
Annotaatiot voidaan sijoittaa metodille tai koko luokalle. Luokkatasolla määritetyt annotaatiot koskevat kaikkia luokan @Benchmark-annotaatioilla merkittyjä metodeja. Näin asetukset pysyvät keskitettyinä, kun luokassa on useita toisiinsa liittyviä benchmarkeja.
Forkkaus
@Fork(n) suorittaa benchmarkin n:ssä uudessa JVM-prosessissa. Forkkaus eristää jokaisen suorituksen aiempien benchmarkien muodostamista JIT-profiileista ja parantaa toistettavuutta. Oletusarvo on yksi fork.
import org.openjdk.jmh.annotations.*;
@Fork(2)
public class Bench {
@Benchmark
public long now() {
return System.nanoTime();
}
}Runnerin käynnistäminen
Benchmarkit käynnistetään main-metodilla, joka määrittää Options-olion ja Runner-olion, tai luodun suoritettavan JAR-tiedoston avulla. include(...)-säännöllinen lauseke valitsee suoritettavat benchmarkit.
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.options.*;
public class Launcher {
public static void main(String[] args) throws Exception {
Options opt = new OptionsBuilder()
.include("Bench")
.build();
new Runner(opt).run();
}
}Tulosteen lukeminen
JMH tulostaa taulukon, jossa näkyvät benchmarkin nimi, tila, näytteiden määrä, tulos, tuloksen virhe ja yksiköt, esimerkiksi: Bench.work avgt 25 3.142 +/- 0.011 ns/op. +/- tarkoittaa luottamusväliä.
Pidä benchmarkit rajattuina
Jokaisen benchmarkin tulisi mitata vain yhtä asiaa. Alustuksen, I/O:n ja testattavan operaation sekoittaminen hämärtää tulosta. Siirtäkää valmistelut @Setup-metodeihin, joita käsitellään tilojen yhteydessä, jotta vain kuuman koodipolun kesto mitataan.
Pikatarkistus
Testatkaa, kuinka hyvin ymmärrätte benchmarkien kirjoittamista.
Kertaus
Opitte kirjoittamaan JMH-benchmarkin:
- Merkitkää metodi annotaatiolla @Benchmark ja palauttakaa tulos.
- @BenchmarkMode valitsee tilan Throughput, AverageTime, SampleTime tai SingleShotTime.
- @OutputTimeUnit määrittää helposti luettavat yksiköt, ja @Fork eristää suoritukset uusissa JVM-prosesseissa.
- Käynnistäkää suoritus yhdistelmällä Runner + Options tai luodulla JAR-tiedostolla.
- Rajataan jokainen benchmark yhteen kuumaan koodipolkuun.
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 ”Vertailutestin kirjoittaminen” ilmainen?
Kyllä – oppitunnin ”Vertailutestin kirjoittaminen” 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 ”Vertailutestin kirjoittaminen”?
@Benchmark ja tilat. 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 2/4.
Kuinka kauan ”Vertailutestin kirjoittaminen”-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.
Kaikki tämän kurssin oppitunnit
- Miksi JMH
- Vertailutestin kirjoittaminen
- Lämmitys ja iteraatiot
- Kuolleen koodin poiston estäminen