Izimo ku-Go kanye nezinkinga zabo

Ingabe ucabanga ukuthi lezi zinketho ezimbili zezimo zokuhlola ngaphakathi kweluphu ziyalingana ngokusebenza?

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


Konke kwaqala “ngokufudumala kobuchopho”; kwadingeka nginikeze isibonelo sosesho olufanele lwenombolo enkulu elinganayo ohlwini lwamanani aphelele [-x....x]. Bengizibuza ukuthi kungaba ngcono kangakanani ukusebenza uma ngisebenzisa ukuphindaphinda okunengqondo ngo-1 ukuthola ukuthi inombolo ilingana noma cha.


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

Isipiliyoni sami sokuhlela ku-Go asibanzi kakhulu, ngaphezu konyaka nesigamu, ngasisebenzisa, noma kaningi, kodwa ngokwezinjongo zokusiza (kahle, mhlawumbe ngaphandle kwephrojekthi eyodwa ehlobene nensizakalo ye-http egcwele), ngakho-ke mina. waqala ngayo. Vula i-GoLand bese ubhala isivivinyo esilula


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
}

Sithola umphumela obonisa ukuthi lapho umkhawulo uphezulu, kulapho kuvela khona ukuguquguquka okuvame kakhulu ekusebenzeni.

Qhathanisamax 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

Kuyacaca ukuthi kuleli cala, emikhawulweni ehlukene sinesethi ehlukene yedatha yokuhlola, umthwalo weprosesa (kwikhompyutha yami ephathekayo ye-i5-2540M) uyahlukahluka cishe ngo-20..30%, inkumbulo ehlalwa uhlelo lokusebenza olusuka ku-GoLand ngokwesilinganiso mayelana ne-813MB - lokhu kuphinde kuthinte ukwethembeka komphumela, udinga ukulondoloza amacala okuhlola kudiski futhi ugijime zonke izivivinyo zomkhawulo ngamunye ngokuzihlukanisa.

Futhi manje, ngicabanga ukuthi ngingakusebenzisa kanjani konke lokhu ngezindleko ezincane, ngilungisa ngokuzenzakalelayo ukuhlolwa kwesimo

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

on

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

Ngiphinde ngiqhube izivivinyo... futhi ngiyayeka ukuqonda noma yini :)

Isikhathi esichithwe ekubulaweni siqala ukuhluka asisahlukanga ngamaphesenti/izingxenyana zephesenti, kodwa ngo-10..15%. Ngingeza ngokushesha ezinye izivivinyo ezingu-2:

		
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
}

Ngiyayigijima futhi ngithole lesi sithombe:Amandla afanayo okuqala: 100000000

umkhawulo ophezulu: 128
maxEvenUmphumela ohlukanisayo: 126 ubude besikhathi 116.0066ms
maxEvenDividing2 umphumela: 126 ubude besikhathi 79.0045ms
maxEvenUmphumela wokuhlanganisa: 126 ubude besikhathi 114.0065ms
maxEvenConjunction2 umphumela: 126 ubude besikhathi 83.0048ms

umkhawulo ophezulu: 256
maxEvenUmphumela ohlukanisayo: 254 ubude besikhathi 111.0063ms
maxEvenDividing2 umphumela: 254 ubude besikhathi 77.0044ms
maxEvenUmphumela wokuhlanganisa: 254 ubude besikhathi 110.0063ms
maxEvenConjunction2 umphumela: 254 ubude besikhathi 80.0046ms

umkhawulo ophezulu: 512
maxEvenUmphumela ohlukanisayo: 510 ubude besikhathi 114.0066ms
maxEvenDividing2 umphumela: 510 ubude besikhathi 80.0045ms
maxEvenUmphumela wokuhlanganisa: 510 ubude besikhathi 110.0063ms
maxEvenConjunction2 umphumela: 510 ubude besikhathi 80.0046ms

umkhawulo ophezulu: 1024
maxEvenUmphumela ohlukanisayo: 1022 ubude besikhathi 109.0063ms
maxEvenDividing2 umphumela: 1022 ubude besikhathi 77.0044ms
maxEvenUmphumela wokuhlanganisa: 1022 ubude besikhathi 111.0063ms
maxEvenConjunction2 umphumela: 1022 ubude besikhathi 81.0047ms

umkhawulo ophezulu: 2048
maxEvenUmphumela ohlukanisayo: 2046 ubude besikhathi 114.0065ms
maxEvenDividing2 umphumela: 2046 ubude besikhathi 79.0045ms
maxEvenUmphumela wokuhlanganisa: 2046 ubude besikhathi 113.0065ms
maxEvenConjunction2 umphumela: 2046 ubude besikhathi 81.0046ms

umkhawulo ophezulu: 4096
maxEvenUmphumela ohlukanisayo: 4094 ubude besikhathi 114.0065ms
maxEvenDividing2 umphumela: 4094 ubude besikhathi 80.0046ms
maxEvenUmphumela wokuhlanganisa: 4094 ubude besikhathi 111.0063ms
maxEvenConjunction2 umphumela: 4094 ubude besikhathi 78.0045ms

umkhawulo ophezulu: 8192
maxEvenUmphumela ohlukanisayo: 8190 ubude besikhathi 107.0062ms
maxEvenDividing2 umphumela: 8190 ubude besikhathi 77.0044ms
maxEvenUmphumela wokuhlanganisa: 8190 ubude besikhathi 111.0063ms
maxEvenConjunction2 umphumela: 8190 ubude besikhathi 77.0044ms

umkhawulo ophezulu: 16384
maxEvenUmphumela ohlukanisayo: 16382 ubude besikhathi 109.0063ms
maxEvenDividing2 umphumela: 16382 ubude besikhathi 77.0044ms
maxEvenUmphumela wokuhlanganisa: 16382 ubude besikhathi 108.0062ms
maxEvenConjunction2 umphumela: 16382 ubude besikhathi 77.0044ms

umkhawulo ophezulu: 32768
maxEvenUmphumela ohlukanisayo: 32766 ubude besikhathi 112.0064ms
maxEvenDividing2 umphumela: 32766 ubude besikhathi 77.0044ms
maxEvenUmphumela wokuhlanganisa: 32766 ubude besikhathi 109.0062ms
maxEvenConjunction2 umphumela: 32766 ubude besikhathi 78.0045ms

umkhawulo ophezulu: 65536
maxEvenUmphumela ohlukanisayo: 65534 ubude besikhathi 109.0062ms
maxEvenDividing2 umphumela: 65534 ubude besikhathi 75.0043ms
maxEvenUmphumela wokuhlanganisa: 65534 ubude besikhathi 109.0063ms
maxEvenConjunction2 umphumela: 65534 ubude besikhathi 79.0045ms

umkhawulo ophezulu: 131072
maxEvenUmphumela ohlukanisayo: 131070 ubude besikhathi 108.0061ms
maxEvenDividing2 umphumela: 131070 ubude besikhathi 76.0044ms
maxEvenUmphumela wokuhlanganisa: 131070 ubude besikhathi 110.0063ms
maxEvenConjunction2 umphumela: 131070 ubude besikhathi 80.0046ms

umkhawulo ophezulu: 262144
maxEvenUmphumela ohlukanisayo: 262142 ubude besikhathi 110.0063ms
maxEvenDividing2 umphumela: 262142 ubude besikhathi 76.0044ms
maxEvenUmphumela wokuhlanganisa: 262142 ubude besikhathi 107.0061ms
maxEvenConjunction2 umphumela: 262142 ubude besikhathi 78.0044ms

umkhawulo ophezulu: 524288
maxEvenUmphumela ohlukanisayo: 524286 ubude besikhathi 109.0062ms
maxEvenDividing2 umphumela: 524286 ubude besikhathi 78.0045ms
maxEvenUmphumela wokuhlanganisa: 524286 ubude besikhathi 109.0062ms
maxEvenConjunction2 umphumela: 524286 ubude besikhathi 80.0046ms

umkhawulo ophezulu: 1048576
maxEvenUmphumela ohlukanisayo: 1048574 ubude besikhathi 109.0063ms
maxEvenDividing2 umphumela: 1048574 ubude besikhathi 80.0045ms
maxEvenUmphumela wokuhlanganisa: 1048574 ubude besikhathi 114.0066ms
maxEvenConjunction2 umphumela: 1048574 ubude besikhathi 78.0044ms

umkhawulo ophezulu: 2097152
maxEvenUmphumela ohlukanisayo: 2097150 ubude besikhathi 111.0064ms
maxEvenDividing2 umphumela: 2097150 ubude besikhathi 79.0045ms
maxEvenUmphumela wokuhlanganisa: 2097150 ubude besikhathi 112.0064ms
maxEvenConjunction2 umphumela: 2097150 ubude besikhathi 77.0044ms

umkhawulo ophezulu: 4194304
maxEvenUmphumela ohlukanisayo: 4194302 ubude besikhathi 111.0063ms
maxEvenDividing2 umphumela: 4194302 ubude besikhathi 78.0045ms
maxEvenUmphumela wokuhlanganisa: 4194302 ubude besikhathi 111.0063ms
maxEvenConjunction2 umphumela: 4194302 ubude besikhathi 77.0044ms

umkhawulo ophezulu: 8388608
maxEvenUmphumela ohlukanisayo: 8388606 ubude besikhathi 109.0062ms
maxEvenDividing2 umphumela: 8388606 ubude besikhathi 78.0045ms
maxEvenUmphumela wokuhlanganisa: 8388606 ubude besikhathi 114.0065ms
maxEvenConjunction2 umphumela: 8388606 ubude besikhathi 78.0045ms

umkhawulo ophezulu: 16777216
maxEvenUmphumela ohlukanisayo: 16777214 ubude besikhathi 109.0062ms
maxEvenDividing2 umphumela: 16777214 ubude besikhathi 77.0044ms
maxEvenUmphumela wokuhlanganisa: 16777214 ubude besikhathi 109.0063ms
maxEvenConjunction2 umphumela: 16777214 ubude besikhathi 77.0044ms

umkhawulo ophezulu: 33554432
maxEvenUmphumela ohlukanisayo: 33554430 ubude besikhathi 113.0065ms
maxEvenDividing2 umphumela: 33554430 ubude besikhathi 78.0045ms
maxEvenUmphumela wokuhlanganisa: 33554430 ubude besikhathi 110.0063ms
maxEvenConjunction2 umphumela: 33554430 ubude besikhathi 80.0045ms

umkhawulo ophezulu: 67108864
maxEvenUmphumela ohlukanisayo: 67108860 ubude besikhathi 112.0064ms
maxEvenDividing2 umphumela: 67108860 ubude besikhathi 77.0044ms
maxEvenUmphumela wokuhlanganisa: 67108860 ubude besikhathi 112.0064ms
maxEvenConjunction2 umphumela: 67108860 ubude besikhathi 80.0046ms

umkhawulo ophezulu: 134217728
maxEvenUmphumela ohlukanisayo: 134217726 ubude besikhathi 109.0063ms
maxEvenDividing2 umphumela: 134217726 ubude besikhathi 78.0044ms
maxEvenUmphumela wokuhlanganisa: 134217726 ubude besikhathi 114.0065ms
maxEvenConjunction2 umphumela: 134217726 ubude besikhathi 81.0047ms

umkhawulo ophezulu: 268435456
maxEvenUmphumela ohlukanisayo: 268435446 ubude besikhathi 111.0064ms
maxEvenDividing2 umphumela: 268435446 ubude besikhathi 79.0045ms
maxEvenUmphumela wokuhlanganisa: 268435446 ubude besikhathi 114.0065ms
maxEvenConjunction2 umphumela: 268435446 ubude besikhathi 79.0045ms

umkhawulo ophezulu: 536870912
maxEvenUmphumela ohlukanisayo: 536870910 ubude besikhathi 107.0062ms
maxEvenDividing2 umphumela: 536870910 ubude besikhathi 76.0043ms
maxEvenUmphumela wokuhlanganisa: 536870910 ubude besikhathi 109.0062ms
maxEvenConjunction2 umphumela: 536870910 ubude besikhathi 80.0046ms

Angikwazanga ukuthola incazelo ecacile yokuthi kungani isihlanganisi se-Go singayithuthukisi kahle ikhodi futhi sihlale sihlola isimo sesibili, ngisho noma esokuqala singamanga. Noma mhlawumbe amehlo ami afiphele nje futhi angiliboni iphutha elisobala? Noma udinga ukunikeza iziyalezo ezikhethekile kumdidiyeli? Ngingajabula ngemibono ephusile.

PS: Yebo, ukuze nje ngizijabulise, ngenze izivivinyo ezifanayo ku-Java 5 ne-Java 7/8 - konke kucacile, isikhathi sokwenza siyafana.

Source: www.habr.com

Engeza amazwana