Nga Tikanga i roto i te Haere me o raatau ahuatanga

Ki to whakaaro he rite enei waahanga e rua mo te whakamatautau i nga ahuatanga o roto o te kapiti ki te mahi?

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


I timata katoa ma te "whakamahana roro"; Me hoatu e au he tauira mo te rapu tino pai mo te tau rite nui rawa atu i roto i te huinga tauoti [-x....x]. Kei te whakaaro ahau he aha te pai ake o te mahi mena ka whakamahia e au te whakarea arorau ki te 1 kia mohio ai he taurite te tau, kaore ranei.


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

Ko taku wheako hotaka i roto i te Go kaore i te tino whanui, neke atu i te kotahi tau me te hawhe, i whakamahia e au, ahakoa he maha nga wa, engari mo nga kaupapa whaihua (he pai, engari mo te kaupapa kotahi e pa ana ki te ratonga http-nui), no reira ahau i timata ki tera. Whakatuwheratia a GoLand ka tuhia he whakamatautau ngawari


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
}

Ka whiwhi tatou i tetahi hua e whakaatu ana ko te teitei ake o te paepae, ka nui ake nga rereketanga o nga mahi ka puta.

Whakatauritehiamax 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

He maamaa kei roto i tenei keehi, mo nga paepae rereke he rereke nga huinga o nga raraunga whakamatautau, ko te utaina o te tukatuka (i runga i taku rorohiko i5-2540M) he rereke i te 20..30%, ko te mahara e nohoia ana e te tono e rere ana mai i GoLand kei te toharite. mo te 813MB - ka pa ano tenei ki te pono o te hua, me tiaki e koe nga keehi whakamatautau i runga i te kōpae me te whakahaere i nga whakamatautau katoa mo ia paepae ma te wehe mai i a raatau.

Na inaianei, e whakaaro ana me pehea te whakatinana i enei mea katoa me nga utu iti, ka whakatika aunoa ahau i te tirotiro ahua

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

i runga i

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

Ka whakahaere ano ahau i nga whakamatautau ... ka mutu taku mohio ki tetahi mea :)

Ko te wa i pau mo te mahi ka timata te rerekee ehara i te paheketanga/hautanga o te paiheneti, engari ma te 10..15%.Ka tere taku taapiri kia 2 ano nga whakamatautau:

		
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
}

Ka whakahaerehia e ahau ka tikina tenei pikitia:kaha huinga tuatahi: 100000000

paepae teitei: 128
maxEvenDividing hua: 126 roa 116.0066ms
hua maxEvenDividing2: 126 te roanga 79.0045ms
hua maxEvenConjunction: 126 roa 114.0065ms
hua maxEvenConjunction2: 126 roa 83.0048ms

paepae teitei: 256
maxEvenDividing hua: 254 roa 111.0063ms
hua maxEvenDividing2: 254 te roanga 77.0044ms
hua maxEvenConjunction: 254 roa 110.0063ms
hua maxEvenConjunction2: 254 roa 80.0046ms

paepae teitei: 512
maxEvenDividing hua: 510 roa 114.0066ms
hua maxEvenDividing2: 510 te roanga 80.0045ms
hua maxEvenConjunction: 510 roa 110.0063ms
hua maxEvenConjunction2: 510 roa 80.0046ms

paepae teitei: 1024
maxEvenDividing hua: 1022 roa 109.0063ms
hua maxEvenDividing2: 1022 te roanga 77.0044ms
hua maxEvenConjunction: 1022 roa 111.0063ms
hua maxEvenConjunction2: 1022 roa 81.0047ms

paepae teitei: 2048
maxEvenDividing hua: 2046 roa 114.0065ms
hua maxEvenDividing2: 2046 te roanga 79.0045ms
hua maxEvenConjunction: 2046 roa 113.0065ms
hua maxEvenConjunction2: 2046 roa 81.0046ms

paepae teitei: 4096
maxEvenDividing hua: 4094 roa 114.0065ms
hua maxEvenDividing2: 4094 te roanga 80.0046ms
hua maxEvenConjunction: 4094 roa 111.0063ms
hua maxEvenConjunction2: 4094 roa 78.0045ms

paepae teitei: 8192
maxEvenDividing hua: 8190 roa 107.0062ms
hua maxEvenDividing2: 8190 te roanga 77.0044ms
hua maxEvenConjunction: 8190 roa 111.0063ms
hua maxEvenConjunction2: 8190 roa 77.0044ms

paepae teitei: 16384
maxEvenDividing hua: 16382 roa 109.0063ms
hua maxEvenDividing2: 16382 te roanga 77.0044ms
hua maxEvenConjunction: 16382 roa 108.0062ms
hua maxEvenConjunction2: 16382 roa 77.0044ms

paepae teitei: 32768
maxEvenDividing hua: 32766 roa 112.0064ms
hua maxEvenDividing2: 32766 te roanga 77.0044ms
hua maxEvenConjunction: 32766 roa 109.0062ms
hua maxEvenConjunction2: 32766 roa 78.0045ms

paepae teitei: 65536
maxEvenDividing hua: 65534 roa 109.0062ms
hua maxEvenDividing2: 65534 te roanga 75.0043ms
hua maxEvenConjunction: 65534 roa 109.0063ms
hua maxEvenConjunction2: 65534 roa 79.0045ms

paepae teitei: 131072
maxEvenDividing hua: 131070 roa 108.0061ms
hua maxEvenDividing2: 131070 te roanga 76.0044ms
hua maxEvenConjunction: 131070 roa 110.0063ms
hua maxEvenConjunction2: 131070 roa 80.0046ms

paepae teitei: 262144
maxEvenDividing hua: 262142 roa 110.0063ms
hua maxEvenDividing2: 262142 te roanga 76.0044ms
hua maxEvenConjunction: 262142 roa 107.0061ms
hua maxEvenConjunction2: 262142 roa 78.0044ms

paepae teitei: 524288
maxEvenDividing hua: 524286 roa 109.0062ms
hua maxEvenDividing2: 524286 te roanga 78.0045ms
hua maxEvenConjunction: 524286 roa 109.0062ms
hua maxEvenConjunction2: 524286 roa 80.0046ms

paepae teitei: 1048576
maxEvenDividing hua: 1048574 roa 109.0063ms
hua maxEvenDividing2: 1048574 te roanga 80.0045ms
hua maxEvenConjunction: 1048574 roa 114.0066ms
hua maxEvenConjunction2: 1048574 roa 78.0044ms

paepae teitei: 2097152
maxEvenDividing hua: 2097150 roa 111.0064ms
hua maxEvenDividing2: 2097150 te roanga 79.0045ms
hua maxEvenConjunction: 2097150 roa 112.0064ms
hua maxEvenConjunction2: 2097150 roa 77.0044ms

paepae teitei: 4194304
maxEvenDividing hua: 4194302 roa 111.0063ms
hua maxEvenDividing2: 4194302 te roanga 78.0045ms
hua maxEvenConjunction: 4194302 roa 111.0063ms
hua maxEvenConjunction2: 4194302 roa 77.0044ms

paepae teitei: 8388608
maxEvenDividing hua: 8388606 roa 109.0062ms
hua maxEvenDividing2: 8388606 te roanga 78.0045ms
hua maxEvenConjunction: 8388606 roa 114.0065ms
hua maxEvenConjunction2: 8388606 roa 78.0045ms

paepae teitei: 16777216
maxEvenDividing hua: 16777214 roa 109.0062ms
hua maxEvenDividing2: 16777214 te roanga 77.0044ms
hua maxEvenConjunction: 16777214 roa 109.0063ms
hua maxEvenConjunction2: 16777214 roa 77.0044ms

paepae teitei: 33554432
maxEvenDividing hua: 33554430 roa 113.0065ms
hua maxEvenDividing2: 33554430 te roanga 78.0045ms
hua maxEvenConjunction: 33554430 roa 110.0063ms
hua maxEvenConjunction2: 33554430 roa 80.0045ms

paepae teitei: 67108864
maxEvenDividing hua: 67108860 roa 112.0064ms
hua maxEvenDividing2: 67108860 te roanga 77.0044ms
hua maxEvenConjunction: 67108860 roa 112.0064ms
hua maxEvenConjunction2: 67108860 roa 80.0046ms

paepae teitei: 134217728
maxEvenDividing hua: 134217726 roa 109.0063ms
hua maxEvenDividing2: 134217726 te roanga 78.0044ms
hua maxEvenConjunction: 134217726 roa 114.0065ms
hua maxEvenConjunction2: 134217726 roa 81.0047ms

paepae teitei: 268435456
maxEvenDividing hua: 268435446 roa 111.0064ms
hua maxEvenDividing2: 268435446 te roanga 79.0045ms
hua maxEvenConjunction: 268435446 roa 114.0065ms
hua maxEvenConjunction2: 268435446 roa 79.0045ms

paepae teitei: 536870912
maxEvenDividing hua: 536870910 roa 107.0062ms
hua maxEvenDividing2: 536870910 te roanga 76.0043ms
hua maxEvenConjunction: 536870910 roa 109.0062ms
hua maxEvenConjunction2: 536870910 roa 80.0046ms

Kaore i kitea e au he whakamaarama marama he aha i kore ai e arotauhia e te Kaihanga Haere te waehere me te tirotiro tonu i te ahuatanga tuarua, ahakoa he teka te mea tuatahi. Aore ra he porangi noa oku kanohi, kaore au e kite i tetahi hapa e kitea ana? Me hoatu ranei e koe etahi tohutohu motuhake ki te kaitoi? Ka koa ahau mo nga korero mohio.

PS: Ae, mo te ngahau noa, i whakahaere ahau i nga whakamatautau rite mo Java 5 me Java 7/8 - he maamaa nga mea katoa, he rite tonu te wa mahi.

Source: will.com

Tāpiri i te kōrero