Pro Golang

edellisessä viestissä, näimme kuinka kirjoittaa yksinkertainen yksikkötesti ja myös miten kirjoittaa taulukkovetoisia testitapauksia. Tässä viestissä näemme nopeasti, miten vertailuarvot kirjoitetaan, sillä go tukee toimintojesi vertailuarvojen ajamista osana standarditestauspakettia.

näiden yksinkertaisten vertailuarvojen avulla voit nopeasti tutkia koodisi toimivuutta. Mutta muista, että tarvitset profiloija mennä perusteellisesti mikä osa koodin aiheuttaa suorituskyvyn pullonkaula.

käytetään edellisessä viestissä kirjoittamaamme alkulukufunktiota vertailuarvojemme kirjoittamiseen.

package primefunc Prime(number uint) bool { switch number { case 0: return false case 1: return false } var i uint = 2 for i < number { if number%i == 0 { return false } i++ } return true}

Kirjoitat benchmark

Aivan kuten testi tapauksissa viitearvot ovat sijoitettu _test.go tiedostot, ja sen sijaan funktio alkaen Test se täytyy aloittaa Benchmark.Meidän benchmark-toiminto on erittäin yksinkertainen ja hyvin samanlainen yksikkö testi tapauksissa.

func BenchmarkPrime(b *testing.B) { for i := 0; i < b.N; i++ { Prime(997) }}

funktio tarvitsee hyväksyä *testing.B objekti ja että on tietoja toistojen benchmark tarvitsee ajaa.Testipaketti pyörittää Vertailutoimintoja useita kertoja. Se pitää lisätä b.N-arvo, kunnes benchmark juoksija on tyytyväinen vakautta vertailuarvo. Sinun täytyy soittaa toiminto b.N kertaa, ja siksi käytämme silmukka iteroi, kunnes b.N kertaa.

Käynnissä olevat viitearvot

komento suorittaa viitearvot on sama kuin ennen, mutta ylimääräinen lippu.

$ go test -bench=.goos: linuxgoarch: amd64pkg: github.com/cnu/primeBenchmarkPrime-4 100000000 18.3 ns/opPASSok github.com/cnu/prime1.847s

lähtö että olemme kiinnostuneita on linjat alkaen Vertailuarvo. Tämä osoittaa, että toiminto Prime(997) teloitettiin 100 Miljoonaa kertaa ja työpöydälle, kesti 18.3 nanosekuntia per puhelu.

läpimeno osoittaa, että go-testissä ajettiin pakkauksessa olleet koelaukut ja kaikki meni läpi. Viimeinen rivi näyttää, kuinka paljon aikaa koko benchmark komento kestää loppuun.

Benchmarking different values

in our benchmark function, we were testing with only one value and testing for it. Mutta mitä jos haluamme benchmark miten se toimii useita muita numeroita syötteenä. Tarvitsemme esikuva-analyysitoiminnon, joka voi ottaa vastaan mielivaltaisia tuloksia.

viety Benchmark-funktiomme kestää vain yhden argumentin-tyypin muuttujan *testing.B. Meillä täytyy siis olla sisäinen auttajatoiminto, joka voi ottaa sen luvun, jolla haluamme sitä vertailla.

func benchmarkPrime(num uint, b *testing.B) { for i := 0; i < b.N; i++ { Prime(num) }}

tätä funktiota ei viedä, vaan se ottaa ylimääräisen argumentin num, joka sitten siirretään Alkufunktiokutsuun. Nyt voimme tehdä meidän BenchmarkPrime kutsua läpi tässä argumentissa.

func BenchmarkPrime1(b *testing.B) { benchmarkPrime(1, b) }func BenchmarkPrime2(b *testing.B) { benchmarkPrime(2, b) }func BenchmarkPrime3(b *testing.B) { benchmarkPrime(3, b) }func BenchmarkPrime183(b *testing.B) { benchmarkPrime(183, b) }func BenchmarkPrime923(b *testing.B) { benchmarkPrime(923, b) }func BenchmarkPrime1039281(b *testing.B) { benchmarkPrime(1039281, b) }

on hyvä käytäntö nimetä Vertailukohtasi kuvailemaan testattavaa arvoa, joten tuotos on helppo jäsentää. Lähtö on kuten alla.

$ go test -bench=.goos: linuxgoarch: amd64pkg: github.com/cnu/primeBenchmarkPrime1-4 1000000000 1.98 ns/opBenchmarkPrime2-4 2000000000 1.98 ns/opBenchmarkPrime3-4 2000000000 1.69 ns/opBenchmarkPrime183-4 100000000 18.2 ns/opBenchmarkPrime923-4 20000000 82.4 ns/opBenchmarkPrime1039281-4 100000000 18.1 ns/opPASSok github.com/cnu/prime15.307s

voimme nähdä, että kuhunkin operaatioon kuluva aika vaihtelee sen mukaan, kuinka monta ohitamme. Tämä antaa meille paljon selkeämmän kuvan siitä, miten suoritamme toimintaamme.

huomioitavat

kun vertailuarvo aloitetaan, sille suoritetaan arvo b. N=1. Jos funktio palaa takaisin sekunnin kuluessa, se ajetaan uudelleen 2, 5, 10, 20, 50, ja niin edelleen. Tämä jatkaa kasvamistaan, kunnes saavutamme yhteensä 1 sekunnin funktion palautumiseen. Voit asettaa eri vertailuajan -benchtime – lipulla.

koska benchmarking-työkalu nostaa asteittain b.N: n arvoa, kannattaa varmistaa, ettei kyseistä numeroa käytetä suoraan funktiokutsuissa.

esim.:

func BenchmarkPrimeWrong(b *testing.B) { for i := 0; i < b.N; i++ { Prime(uint(i)) }}

tässä esimerkissä funktio ei täydentyisi, koska siirrämme I: n arvon Alkufunktiolle. Ja koska tämä lisääntyy jatkuvasti progressiivisesti, se ei koskaan saavuta vakaata tilaa.

func BenchmarkPrimeWrong2(b *testing.B) { Prime(uint(b.N))}

ja tässä toisessa esimerkissä siirrämme arvon b. n itse Alkufunktiolle. Tämä vain ajaa sen kerran, eikä oikeastaan mitään vertailukohtaa. Tuloste olisi 0ns / op.

johtopäätös

Go tarjoaa mukavia työkaluja testata ja vertailla koodiasi, että se tekee koodistasi itsedokumentoivan. Ja kaikki muutokset teet codebase, testataan välittömästi, sekä oikeellisuus ja suorituskyky kiinni mitään regressioita.

Vastaa

Sähköpostiosoitettasi ei julkaista.