Java Academy · Oppitunti

Vertailutestin kirjoittaminen

@Benchmark ja tilat.

Oppitunti 2/413 vaihetta

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.
Aloita maksutta

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

  1. Miksi JMH
  2. Vertailutestin kirjoittaminen
  3. Lämmitys ja iteraatiot
  4. Kuolleen koodin poiston estäminen
← Takaisin: Java Academy