Kondisyon nan Go ak kapris yo

Èske ou panse de opsyon sa yo pou tès kondisyon andedan yon bouk yo ekivalan nan pèfòmans?

		
if a > b && c*2 > d {
	....
}
// и
if a <= b  { 
  continue;
}
if c*2 > d {
 ....
}


Tout bagay te kòmanse ak yon "chofe nan sèvo"; mwen te oblije bay yon egzanp yon rechèch optimal pou pi gwo nimewo menm nan yon seri nonb antye relatif [-x....x]. Mwen t ap mande konbyen pi bon pèfòmans ta si mwen te itilize miltiplikasyon lojik pa 1 pou m konnen si yon nimewo se menm oswa ou pa.


//у четных чисел последний бит всегда равен 0
value & 1 == 0
//vs классический метод
value % 2 == 0

Eksperyans pwogram mwen an nan Go se pa trè vaste, jis plis pase yon ane ak yon mwatye, mwen te itilize li, byenke souvan, men piman pou rezon itilite (byen, petèt eksepte pou yon pwojè ki gen rapò ak yon sèvis http wo-chaj), kidonk mwen te kòmanse avèk li. Louvri GoLand epi ekri yon tès senp


package main
import (
	"fmt"
	"log"
	"math"
	"math/rand"
	"time"
)
const size = 100000000 //math.MaxInt32*2
type Result struct {
	Name     string
	Duration time.Duration
	Value    int32
}

func main() {
	log.Println("initial array capacity: " + fmt.Sprint(size))
	var maxValue int32
        // Будем варьировать диапазон чисел от минимального 
        // до максимального. Чем меньше диапазон, тем больше 
        // процессорного времени будет уходить на операцию 
        // сравнения текущего числа, с ранее найденным и наоборот
	for maxValue = 128; maxValue < math.MaxInt32/2+1; maxValue = maxValue * 2 {
		test(maxValue)
	}
}

func test(maxValue int32) {
	log.Println("max threshold: " + fmt.Sprint(maxValue))
	arr := make([]int32, size)
	for i := range arr {
		arr[i] = rand.Int31n(maxValue)
                // в тестовых данных нам нужны и отрицательные числа 
		sign := rand.Intn(2)
		if sign == 1 {
			arr[i] = -arr[i]
		}
	}

        // запускаем тест "деление с остатком"
	result := maxEvenDividing("maxEvenDividing", arr)
	log.Printf(result.Name+"t result: "+fmt.Sprint(result.Value)+"ttduration %s", result.Duration)

        // запускаем тест "конъюнкции"
	result = maxEvenConjunction("maxEvenConjunction", arr)
	log.Printf(result.Name+"t result: "+fmt.Sprint(result.Value)+"ttduration %s", result.Duration)
}

func maxEvenDividing(name string, arr []int32) Result {
	start := time.Now()
	var current int32 = math.MinInt32
	for _, value := range arr {
		if value > current && value%2 == 0 {
			current = value
		}
	}
	duration := time.Since(start)
	result := Result{name, duration, current}
	return result
}

func maxEvenConjunction(name string, arr []int32) Result {
	start := time.Now()
	var current int32 = math.MinInt32
	for _, value := range arr {
		if value > current && value&1 == 0 {
			current = value
		}
	}
	duration := time.Since(start)
	result := Result{name, duration, current}
	return result
}

Nou jwenn yon rezilta ki montre ke pi wo papòt la, pi souvan fluctuations nan pèfòmans parèt.

Konparemax threshold: 128
maxEvenDividing result: 126 duration 116.0067ms
maxEvenConjunction result: 126 duration 116.0066ms

max threshold: 16384
maxEvenDividing result: 16382 duration 115.0066ms
maxEvenConjunction result: 16382 duration 111.0064ms

......

max threshold: 8388608
maxEvenDividing result: 8388606 duration 109.0063ms
maxEvenConjunction result: 8388606 duration 109.0062ms

max threshold: 16777216
maxEvenDividing result: 16777214 duration 108.0062ms
maxEvenConjunction result: 16777214 duration 109.0062ms

max threshold: 33554432
maxEvenDividing result: 33554430 duration 114.0066ms
maxEvenConjunction result: 33554430 duration 110.0063ms

max threshold: 67108864
maxEvenDividing result: 67108860 duration 111.0064ms
maxEvenConjunction result: 67108860 duration 109.0062ms

max threshold: 134217728
maxEvenDividing result: 134217726 duration 108.0062ms
maxEvenConjunction result: 134217726 duration 109.0063ms

max threshold: 268435456
maxEvenDividing result: 268435446 duration 111.0063ms
maxEvenConjunction result: 268435446 duration 110.0063ms

Li klè ke nan ka sa a, pou diferan papòt nou gen diferan seri done tès, chaj la processeur (sou laptop i5-2540M mwen an) varye alantou 20..30%, memwa a okipe pa aplikasyon an kouri soti nan GoLand se an mwayèn. sou 813MB - sa a se tou afekte fyab nan rezilta a, ou bezwen pou konsève pou ka tès yo sou disk epi kouri tout tès pou chak papòt nan izolasyon youn ak lòt.

Epi, koulye a, panse sou ki jan yo aplike tout bagay sa a ak depans minim, mwen otomatikman korije chèk la kondisyon

		
if value > current && value&1 == 0 {
	current = value
}

sou

		
if value <= current {
        continue;
}
if value&1 == 0 {
	current = value
}

Mwen kouri tès yo ankò... epi mwen sispann konprann anyen :)

Tan ki pase nan ekzekisyon an kòmanse diferan ankò pa pousantaj / fraksyon nan yon pousan, men pa 10..15%. Mwen byen vit ajoute 2 lòt tès:

		
func maxEvenDividing2(name string, arr []int32) Result {
	start := time.Now()
	var current int32 = math.MinInt32
	for _, value := range arr {
		if value <= current {
			continue
		}

		if value%2 == 0 {
			current = value
		}
	}
	duration := time.Since(start)
	result := Result{name, duration, current}
	return result
}

func maxEvenConjunction2(name string, arr []int32) Result {
	start := time.Now()
	var current int32 = math.MinInt32
	for _, value := range arr {
		if value <= current {
			continue
		}
		if value&1 == 0 {
			current = value
		}
	}
	duration := time.Since(start)
	result := Result{name, duration, current}
	return result
}

Mwen kouri li epi mwen jwenn foto sa a:inisyal etalaj kapasite: 100000000

papòt maksimòm: 128
maxEvenDividing rezilta: 126 dire 116.0066ms
maxEvenDividing2 rezilta: 126 dire 79.0045ms
maxEvenConjunction rezilta: 126 dire 114.0065ms
maxEvenConjunction2 rezilta: 126 dire 83.0048ms

papòt maksimòm: 256
maxEvenDividing rezilta: 254 dire 111.0063ms
maxEvenDividing2 rezilta: 254 dire 77.0044ms
maxEvenConjunction rezilta: 254 dire 110.0063ms
maxEvenConjunction2 rezilta: 254 dire 80.0046ms

papòt maksimòm: 512
maxEvenDividing rezilta: 510 dire 114.0066ms
maxEvenDividing2 rezilta: 510 dire 80.0045ms
maxEvenConjunction rezilta: 510 dire 110.0063ms
maxEvenConjunction2 rezilta: 510 dire 80.0046ms

papòt maksimòm: 1024
maxEvenDividing rezilta: 1022 dire 109.0063ms
maxEvenDividing2 rezilta: 1022 dire 77.0044ms
maxEvenConjunction rezilta: 1022 dire 111.0063ms
maxEvenConjunction2 rezilta: 1022 dire 81.0047ms

papòt maksimòm: 2048
maxEvenDividing rezilta: 2046 dire 114.0065ms
maxEvenDividing2 rezilta: 2046 dire 79.0045ms
maxEvenConjunction rezilta: 2046 dire 113.0065ms
maxEvenConjunction2 rezilta: 2046 dire 81.0046ms

papòt maksimòm: 4096
maxEvenDividing rezilta: 4094 dire 114.0065ms
maxEvenDividing2 rezilta: 4094 dire 80.0046ms
maxEvenConjunction rezilta: 4094 dire 111.0063ms
maxEvenConjunction2 rezilta: 4094 dire 78.0045ms

papòt maksimòm: 8192
maxEvenDividing rezilta: 8190 dire 107.0062ms
maxEvenDividing2 rezilta: 8190 dire 77.0044ms
maxEvenConjunction rezilta: 8190 dire 111.0063ms
maxEvenConjunction2 rezilta: 8190 dire 77.0044ms

papòt maksimòm: 16384
maxEvenDividing rezilta: 16382 dire 109.0063ms
maxEvenDividing2 rezilta: 16382 dire 77.0044ms
maxEvenConjunction rezilta: 16382 dire 108.0062ms
maxEvenConjunction2 rezilta: 16382 dire 77.0044ms

papòt maksimòm: 32768
maxEvenDividing rezilta: 32766 dire 112.0064ms
maxEvenDividing2 rezilta: 32766 dire 77.0044ms
maxEvenConjunction rezilta: 32766 dire 109.0062ms
maxEvenConjunction2 rezilta: 32766 dire 78.0045ms

papòt maksimòm: 65536
maxEvenDividing rezilta: 65534 dire 109.0062ms
maxEvenDividing2 rezilta: 65534 dire 75.0043ms
maxEvenConjunction rezilta: 65534 dire 109.0063ms
maxEvenConjunction2 rezilta: 65534 dire 79.0045ms

papòt maksimòm: 131072
maxEvenDividing rezilta: 131070 dire 108.0061ms
maxEvenDividing2 rezilta: 131070 dire 76.0044ms
maxEvenConjunction rezilta: 131070 dire 110.0063ms
maxEvenConjunction2 rezilta: 131070 dire 80.0046ms

papòt maksimòm: 262144
maxEvenDividing rezilta: 262142 dire 110.0063ms
maxEvenDividing2 rezilta: 262142 dire 76.0044ms
maxEvenConjunction rezilta: 262142 dire 107.0061ms
maxEvenConjunction2 rezilta: 262142 dire 78.0044ms

papòt maksimòm: 524288
maxEvenDividing rezilta: 524286 dire 109.0062ms
maxEvenDividing2 rezilta: 524286 dire 78.0045ms
maxEvenConjunction rezilta: 524286 dire 109.0062ms
maxEvenConjunction2 rezilta: 524286 dire 80.0046ms

papòt maksimòm: 1048576
maxEvenDividing rezilta: 1048574 dire 109.0063ms
maxEvenDividing2 rezilta: 1048574 dire 80.0045ms
maxEvenConjunction rezilta: 1048574 dire 114.0066ms
maxEvenConjunction2 rezilta: 1048574 dire 78.0044ms

papòt maksimòm: 2097152
maxEvenDividing rezilta: 2097150 dire 111.0064ms
maxEvenDividing2 rezilta: 2097150 dire 79.0045ms
maxEvenConjunction rezilta: 2097150 dire 112.0064ms
maxEvenConjunction2 rezilta: 2097150 dire 77.0044ms

papòt maksimòm: 4194304
maxEvenDividing rezilta: 4194302 dire 111.0063ms
maxEvenDividing2 rezilta: 4194302 dire 78.0045ms
maxEvenConjunction rezilta: 4194302 dire 111.0063ms
maxEvenConjunction2 rezilta: 4194302 dire 77.0044ms

papòt maksimòm: 8388608
maxEvenDividing rezilta: 8388606 dire 109.0062ms
maxEvenDividing2 rezilta: 8388606 dire 78.0045ms
maxEvenConjunction rezilta: 8388606 dire 114.0065ms
maxEvenConjunction2 rezilta: 8388606 dire 78.0045ms

papòt maksimòm: 16777216
maxEvenDividing rezilta: 16777214 dire 109.0062ms
maxEvenDividing2 rezilta: 16777214 dire 77.0044ms
maxEvenConjunction rezilta: 16777214 dire 109.0063ms
maxEvenConjunction2 rezilta: 16777214 dire 77.0044ms

papòt maksimòm: 33554432
maxEvenDividing rezilta: 33554430 dire 113.0065ms
maxEvenDividing2 rezilta: 33554430 dire 78.0045ms
maxEvenConjunction rezilta: 33554430 dire 110.0063ms
maxEvenConjunction2 rezilta: 33554430 dire 80.0045ms

papòt maksimòm: 67108864
maxEvenDividing rezilta: 67108860 dire 112.0064ms
maxEvenDividing2 rezilta: 67108860 dire 77.0044ms
maxEvenConjunction rezilta: 67108860 dire 112.0064ms
maxEvenConjunction2 rezilta: 67108860 dire 80.0046ms

papòt maksimòm: 134217728
maxEvenDividing rezilta: 134217726 dire 109.0063ms
maxEvenDividing2 rezilta: 134217726 dire 78.0044ms
maxEvenConjunction rezilta: 134217726 dire 114.0065ms
maxEvenConjunction2 rezilta: 134217726 dire 81.0047ms

papòt maksimòm: 268435456
maxEvenDividing rezilta: 268435446 dire 111.0064ms
maxEvenDividing2 rezilta: 268435446 dire 79.0045ms
maxEvenConjunction rezilta: 268435446 dire 114.0065ms
maxEvenConjunction2 rezilta: 268435446 dire 79.0045ms

papòt maksimòm: 536870912
maxEvenDividing rezilta: 536870910 dire 107.0062ms
maxEvenDividing2 rezilta: 536870910 dire 76.0043ms
maxEvenConjunction rezilta: 536870910 dire 109.0062ms
maxEvenConjunction2 rezilta: 536870910 dire 80.0046ms

Mwen pa t 'kapab jwenn yon eksplikasyon klè poukisa konpilatè Go a pa optimize kòd la epi li toujou tcheke dezyèm kondisyon an, menm si premye a se fo. Oswa petèt je m yo jis twoub epi mwen pa wè okenn erè evidan? Oswa èske ou bezwen bay kèk enstriksyon espesyal pou du a? Mwen ta kontan pou kòmantè sansib.

PS: Wi, jis pou plezi, mwen te fè tès menm jan an sou Java 5 ak Java 7/8 - tout bagay klè, tan an ekzekisyon se menm bagay la.

Sous: www.habr.com

Add nouvo kòmantè