Iimeko kwi-Go kunye ne-quirks yazo

Ngaba ucinga ukuba ezi zimbini iinketho zeemeko zokuvavanya ngaphakathi kwi-loop ziyalingana ekusebenzeni?

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


Yonke le nto iqale “ngokufudumala kwengqondo”, kuye kwafuneka ndinike umzekelo wokukhangela elona nani likhulu ngokulinganayo kuluhlu lweenombolo [-x....x]. Bendizibuza ukuba inokuba ngcono kangakanani na ukusebenza ukuba ndisebenzise uphindaphindo olunengqiqo ngo-1 ukufumanisa ukuba inani lide okanye hayi.


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

Amava am enkqubo kwi-Go ayibanzi kakhulu, ngaphezu konyaka kunye nesiqingatha, ndiyisebenzise, ​​nangona rhoqo, kodwa kuphela ngeenjongo zokusetyenziswa (kakuhle, mhlawumbi ngaphandle kweprojekthi enye enxulumene nomthwalo ophezulu wenkonzo ye-http), ngoko ke waqala ngayo. Vula iGoLand kwaye ubhale uvavanyo olulula


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
}

Sifumana isiphumo esibonisa ukuba okukhona uphezulu umgubasi, kokukhona ukuguquguquka okuqhelekileyo kokusebenza kubonakala.

Thelekisamax 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

Kucacile ukuba kule meko, kwimigangatho eyahlukeneyo sineesethi ezahlukeneyo zedatha yokuvavanya, umthwalo weprosesa (kwi-laptop i5-2540M yam) iyahluka malunga ne-20. malunga ne-30MB - oku kukwachaphazela ukuthembeka kwesiphumo, kufuneka ugcine iimeko zovavanyo kwidiski kwaye uqhube zonke iimvavanyo zomqobo ngamnye ngokuzimeleyo.

Kwaye ngoku, ndicinga malunga nendlela yokuphumeza konke oku ngeendleko ezincinci, ndilungisa ngokuzenzekelayo ukujonga imeko

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

phezu

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

Ndiqhuba iimvavanyo kwakhona ... kwaye ndiyeka ukuqonda nantoni na :)

Ixesha elichithwe ekubulaweni liqala ukwahluka alisahlukanga ngeepesenti/amaqhezu epesenti, kodwa nge-10..15%.

		
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
}

Ndiyayiqhuba kwaye ndifumana lo mfanekiso:uluhlu lokuqala umthamo: 100000000

ubukhulu becala: 128
maxEvenUkwahlulwahlulwa kwesiphumo: 126 ubude bexesha 116.0066ms
maxEvenDividing2 iziphumo: 126 ubude bexesha 79.0045ms
maxEvenIsiphumo sokudibanisa: 126 ubude bexesha 114.0065ms
maxEvenConjunction2 iziphumo: 126 ubude 83.0048ms

ubukhulu becala: 256
maxEvenUkwahlulwahlulwa kwesiphumo: 254 ubude bexesha 111.0063ms
maxEvenDividing2 iziphumo: 254 ubude bexesha 77.0044ms
maxEvenIsiphumo sokudibanisa: 254 ubude bexesha 110.0063ms
maxEvenConjunction2 iziphumo: 254 ubude 80.0046ms

ubukhulu becala: 512
maxEvenUkwahlulwahlulwa kwesiphumo: 510 ubude bexesha 114.0066ms
maxEvenDividing2 iziphumo: 510 ubude bexesha 80.0045ms
maxEvenIsiphumo sokudibanisa: 510 ubude bexesha 110.0063ms
maxEvenConjunction2 iziphumo: 510 ubude 80.0046ms

ubukhulu becala: 1024
maxEvenUkwahlulwahlulwa kwesiphumo: 1022 ubude bexesha 109.0063ms
maxEvenDividing2 iziphumo: 1022 ubude bexesha 77.0044ms
maxEvenIsiphumo sokudibanisa: 1022 ubude bexesha 111.0063ms
maxEvenConjunction2 iziphumo: 1022 ubude 81.0047ms

ubukhulu becala: 2048
maxEvenUkwahlulwahlulwa kwesiphumo: 2046 ubude bexesha 114.0065ms
maxEvenDividing2 iziphumo: 2046 ubude bexesha 79.0045ms
maxEvenIsiphumo sokudibanisa: 2046 ubude bexesha 113.0065ms
maxEvenConjunction2 iziphumo: 2046 ubude 81.0046ms

ubukhulu becala: 4096
maxEvenUkwahlulwahlulwa kwesiphumo: 4094 ubude bexesha 114.0065ms
maxEvenDividing2 iziphumo: 4094 ubude bexesha 80.0046ms
maxEvenIsiphumo sokudibanisa: 4094 ubude bexesha 111.0063ms
maxEvenConjunction2 iziphumo: 4094 ubude 78.0045ms

ubukhulu becala: 8192
maxEvenUkwahlulwahlulwa kwesiphumo: 8190 ubude bexesha 107.0062ms
maxEvenDividing2 iziphumo: 8190 ubude bexesha 77.0044ms
maxEvenIsiphumo sokudibanisa: 8190 ubude bexesha 111.0063ms
maxEvenConjunction2 iziphumo: 8190 ubude 77.0044ms

ubukhulu becala: 16384
maxEvenUkwahlulwahlulwa kwesiphumo: 16382 ubude bexesha 109.0063ms
maxEvenDividing2 iziphumo: 16382 ubude bexesha 77.0044ms
maxEvenIsiphumo sokudibanisa: 16382 ubude bexesha 108.0062ms
maxEvenConjunction2 iziphumo: 16382 ubude 77.0044ms

ubukhulu becala: 32768
maxEvenUkwahlulwahlulwa kwesiphumo: 32766 ubude bexesha 112.0064ms
maxEvenDividing2 iziphumo: 32766 ubude bexesha 77.0044ms
maxEvenIsiphumo sokudibanisa: 32766 ubude bexesha 109.0062ms
maxEvenConjunction2 iziphumo: 32766 ubude 78.0045ms

ubukhulu becala: 65536
maxEvenUkwahlulwahlulwa kwesiphumo: 65534 ubude bexesha 109.0062ms
maxEvenDividing2 iziphumo: 65534 ubude bexesha 75.0043ms
maxEvenIsiphumo sokudibanisa: 65534 ubude bexesha 109.0063ms
maxEvenConjunction2 iziphumo: 65534 ubude 79.0045ms

ubukhulu becala: 131072
maxEvenUkwahlulwahlulwa kwesiphumo: 131070 ubude bexesha 108.0061ms
maxEvenDividing2 iziphumo: 131070 ubude bexesha 76.0044ms
maxEvenIsiphumo sokudibanisa: 131070 ubude bexesha 110.0063ms
maxEvenConjunction2 iziphumo: 131070 ubude 80.0046ms

ubukhulu becala: 262144
maxEvenUkwahlulwahlulwa kwesiphumo: 262142 ubude bexesha 110.0063ms
maxEvenDividing2 iziphumo: 262142 ubude bexesha 76.0044ms
maxEvenIsiphumo sokudibanisa: 262142 ubude bexesha 107.0061ms
maxEvenConjunction2 iziphumo: 262142 ubude 78.0044ms

ubukhulu becala: 524288
maxEvenUkwahlulwahlulwa kwesiphumo: 524286 ubude bexesha 109.0062ms
maxEvenDividing2 iziphumo: 524286 ubude bexesha 78.0045ms
maxEvenIsiphumo sokudibanisa: 524286 ubude bexesha 109.0062ms
maxEvenConjunction2 iziphumo: 524286 ubude 80.0046ms

ubukhulu becala: 1048576
maxEvenUkwahlulwahlulwa kwesiphumo: 1048574 ubude bexesha 109.0063ms
maxEvenDividing2 iziphumo: 1048574 ubude bexesha 80.0045ms
maxEvenIsiphumo sokudibanisa: 1048574 ubude bexesha 114.0066ms
maxEvenConjunction2 iziphumo: 1048574 ubude 78.0044ms

ubukhulu becala: 2097152
maxEvenUkwahlulwahlulwa kwesiphumo: 2097150 ubude bexesha 111.0064ms
maxEvenDividing2 iziphumo: 2097150 ubude bexesha 79.0045ms
maxEvenIsiphumo sokudibanisa: 2097150 ubude bexesha 112.0064ms
maxEvenConjunction2 iziphumo: 2097150 ubude 77.0044ms

ubukhulu becala: 4194304
maxEvenUkwahlulwahlulwa kwesiphumo: 4194302 ubude bexesha 111.0063ms
maxEvenDividing2 iziphumo: 4194302 ubude bexesha 78.0045ms
maxEvenIsiphumo sokudibanisa: 4194302 ubude bexesha 111.0063ms
maxEvenConjunction2 iziphumo: 4194302 ubude 77.0044ms

ubukhulu becala: 8388608
maxEvenUkwahlulwahlulwa kwesiphumo: 8388606 ubude bexesha 109.0062ms
maxEvenDividing2 iziphumo: 8388606 ubude bexesha 78.0045ms
maxEvenIsiphumo sokudibanisa: 8388606 ubude bexesha 114.0065ms
maxEvenConjunction2 iziphumo: 8388606 ubude 78.0045ms

ubukhulu becala: 16777216
maxEvenUkwahlulwahlulwa kwesiphumo: 16777214 ubude bexesha 109.0062ms
maxEvenDividing2 iziphumo: 16777214 ubude bexesha 77.0044ms
maxEvenIsiphumo sokudibanisa: 16777214 ubude bexesha 109.0063ms
maxEvenConjunction2 iziphumo: 16777214 ubude 77.0044ms

ubukhulu becala: 33554432
maxEvenUkwahlulwahlulwa kwesiphumo: 33554430 ubude bexesha 113.0065ms
maxEvenDividing2 iziphumo: 33554430 ubude bexesha 78.0045ms
maxEvenIsiphumo sokudibanisa: 33554430 ubude bexesha 110.0063ms
maxEvenConjunction2 iziphumo: 33554430 ubude 80.0045ms

ubukhulu becala: 67108864
maxEvenUkwahlulwahlulwa kwesiphumo: 67108860 ubude bexesha 112.0064ms
maxEvenDividing2 iziphumo: 67108860 ubude bexesha 77.0044ms
maxEvenIsiphumo sokudibanisa: 67108860 ubude bexesha 112.0064ms
maxEvenConjunction2 iziphumo: 67108860 ubude 80.0046ms

ubukhulu becala: 134217728
maxEvenUkwahlulwahlulwa kwesiphumo: 134217726 ubude bexesha 109.0063ms
maxEvenDividing2 iziphumo: 134217726 ubude bexesha 78.0044ms
maxEvenIsiphumo sokudibanisa: 134217726 ubude bexesha 114.0065ms
maxEvenConjunction2 iziphumo: 134217726 ubude 81.0047ms

ubukhulu becala: 268435456
maxEvenUkwahlulwahlulwa kwesiphumo: 268435446 ubude bexesha 111.0064ms
maxEvenDividing2 iziphumo: 268435446 ubude bexesha 79.0045ms
maxEvenIsiphumo sokudibanisa: 268435446 ubude bexesha 114.0065ms
maxEvenConjunction2 iziphumo: 268435446 ubude 79.0045ms

ubukhulu becala: 536870912
maxEvenUkwahlulwahlulwa kwesiphumo: 536870910 ubude bexesha 107.0062ms
maxEvenDividing2 iziphumo: 536870910 ubude bexesha 76.0043ms
maxEvenIsiphumo sokudibanisa: 536870910 ubude bexesha 109.0062ms
maxEvenConjunction2 iziphumo: 536870910 ubude 80.0046ms

Andizange ndifumane ingcaciso ecacileyo yokuba kutheni i-Go compiler ingayinyusi ikhowudi kwaye ihlala ihlola imeko yesibini, nokuba eyokuqala ibubuxoki. Okanye mhlawumbi amehlo am amnyama kwaye andiboni mpazamo icacileyo? Okanye ngaba ufuna ukubonelela ngemiyalelo ekhethekileyo kumqokeleli? Ndingavuya ngeenkcazo ezinengqiqo.

PS: Ewe, nje ngokuzonwabisa, ndiqhube iimvavanyo ezifanayo kwiJava 5 kunye neJava 7/8 - yonke into icacile, ixesha lokubulawa liyafana.

umthombo: www.habr.com

Yongeza izimvo