Nā kūlana ma Go a me kā lākou mau ʻano

Manaʻo ʻoe ua like kēia mau koho ʻelua no ka hoʻāʻo ʻana i nā kūlana i loko o kahi loop i ka hana?

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


Ua hoʻomaka ia me ka "hoʻomaʻamaʻa lolo"; Pono wau e hāʻawi i kahi laʻana o kahi hulina maikaʻi loa no ka helu nui loa i loko o kahi ʻano o nā helu helu [-x....x]. Ke noʻonoʻo nei au i ka ʻoi aku o ka maikaʻi o ka hana inā hoʻohana au i ka hoʻonui loiloi me ka 1 e ʻike ai inā he helu a ʻaʻole paha.


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

ʻAʻole nui loa kaʻu ʻike hoʻolālā ma Go, ʻoi aku ma mua o hoʻokahi makahiki a me ka hapa, ua hoʻohana au iā ia, ʻoiai pinepine, akā maʻemaʻe no nā kumu utilitarian (maikaʻi, koe wale nō kahi papahana e pili ana i kahi lawelawe http kiʻekiʻe loa), no laila au hoʻomaka me ia. E wehe iā GoLand a kākau i kahi hoʻokolohua maʻalahi


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
}

Loaʻa iā mākou kahi hopena e hōʻike ana i ke kiʻekiʻe o ka paepae, ʻoi aku ka nui o nā fluctuations o ka hana.

Hoʻohālikelikemax 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

Ua maopopo i kēia hihia, no nā paepae like ʻole, loaʻa iā mākou nā ʻano like ʻole o ka ʻikepili hoʻāʻo, ʻo ka hoʻouka ʻana (ma kaʻu kamepiula i5-2540M) ʻokoʻa ma kahi o 20..30%, ʻo ka hoʻomanaʻo i noho ʻia e ka noi e holo ana mai GoLand ma ka awelika. e pili ana i 813MB - pili pū kēia i ka hilinaʻi o ka hopena, pono ʻoe e mālama i nā hihia hoʻāʻo ma ka disk a holo i nā hoʻokolohua āpau no kēlā me kēia paepae ma kahi kaʻawale mai kekahi.

A i kēia manawa, e noʻonoʻo ana pehea e hoʻokō ai i kēia me nā kumukūʻai liʻiliʻi, hoʻoponopono koke wau i ka nānā kūlana

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

maluna o

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

Holo hou au i nā ho'āʻo... a oki au i ka hoʻomaopopo ʻana i kekahi mea :)

Hoʻomaka ka ʻokoʻa o ka manawa i hoʻopau ʻia ma ka pākēneka/haʻina o ka pākēneka, akā ma ka 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
}

Holo wau a loaʻa kēia kiʻi:ka mana hoʻonohonoho mua: 100000000

pae kiʻekiʻe: 128
maxEvenDividing hopena: 126 lōʻihi 116.0066ms
hopena maxEvenDividing2: 126 lōʻihi 79.0045ms
hopena maxEvenConjunction: 126 lōʻihi 114.0065ms
hopena maxEvenConjunction2: 126 lōʻihi 83.0048ms

pae kiʻekiʻe: 256
maxEvenDividing hopena: 254 lōʻihi 111.0063ms
hopena maxEvenDividing2: 254 lōʻihi 77.0044ms
hopena maxEvenConjunction: 254 lōʻihi 110.0063ms
hopena maxEvenConjunction2: 254 lōʻihi 80.0046ms

pae kiʻekiʻe: 512
maxEvenDividing hopena: 510 lōʻihi 114.0066ms
hopena maxEvenDividing2: 510 lōʻihi 80.0045ms
hopena maxEvenConjunction: 510 lōʻihi 110.0063ms
hopena maxEvenConjunction2: 510 lōʻihi 80.0046ms

pae kiʻekiʻe: 1024
maxEvenDividing hopena: 1022 lōʻihi 109.0063ms
hopena maxEvenDividing2: 1022 lōʻihi 77.0044ms
hopena maxEvenConjunction: 1022 lōʻihi 111.0063ms
hopena maxEvenConjunction2: 1022 lōʻihi 81.0047ms

pae kiʻekiʻe: 2048
maxEvenDividing hopena: 2046 lōʻihi 114.0065ms
hopena maxEvenDividing2: 2046 lōʻihi 79.0045ms
hopena maxEvenConjunction: 2046 lōʻihi 113.0065ms
hopena maxEvenConjunction2: 2046 lōʻihi 81.0046ms

pae kiʻekiʻe: 4096
maxEvenDividing hopena: 4094 lōʻihi 114.0065ms
hopena maxEvenDividing2: 4094 lōʻihi 80.0046ms
hopena maxEvenConjunction: 4094 lōʻihi 111.0063ms
hopena maxEvenConjunction2: 4094 lōʻihi 78.0045ms

pae kiʻekiʻe: 8192
maxEvenDividing hopena: 8190 lōʻihi 107.0062ms
hopena maxEvenDividing2: 8190 lōʻihi 77.0044ms
hopena maxEvenConjunction: 8190 lōʻihi 111.0063ms
hopena maxEvenConjunction2: 8190 lōʻihi 77.0044ms

pae kiʻekiʻe: 16384
maxEvenDividing hopena: 16382 lōʻihi 109.0063ms
hopena maxEvenDividing2: 16382 lōʻihi 77.0044ms
hopena maxEvenConjunction: 16382 lōʻihi 108.0062ms
hopena maxEvenConjunction2: 16382 lōʻihi 77.0044ms

pae kiʻekiʻe: 32768
maxEvenDividing hopena: 32766 lōʻihi 112.0064ms
hopena maxEvenDividing2: 32766 lōʻihi 77.0044ms
hopena maxEvenConjunction: 32766 lōʻihi 109.0062ms
hopena maxEvenConjunction2: 32766 lōʻihi 78.0045ms

pae kiʻekiʻe: 65536
maxEvenDividing hopena: 65534 lōʻihi 109.0062ms
hopena maxEvenDividing2: 65534 lōʻihi 75.0043ms
hopena maxEvenConjunction: 65534 lōʻihi 109.0063ms
hopena maxEvenConjunction2: 65534 lōʻihi 79.0045ms

pae kiʻekiʻe: 131072
maxEvenDividing hopena: 131070 lōʻihi 108.0061ms
hopena maxEvenDividing2: 131070 lōʻihi 76.0044ms
hopena maxEvenConjunction: 131070 lōʻihi 110.0063ms
hopena maxEvenConjunction2: 131070 lōʻihi 80.0046ms

pae kiʻekiʻe: 262144
maxEvenDividing hopena: 262142 lōʻihi 110.0063ms
hopena maxEvenDividing2: 262142 lōʻihi 76.0044ms
hopena maxEvenConjunction: 262142 lōʻihi 107.0061ms
hopena maxEvenConjunction2: 262142 lōʻihi 78.0044ms

pae kiʻekiʻe: 524288
maxEvenDividing hopena: 524286 lōʻihi 109.0062ms
hopena maxEvenDividing2: 524286 lōʻihi 78.0045ms
hopena maxEvenConjunction: 524286 lōʻihi 109.0062ms
hopena maxEvenConjunction2: 524286 lōʻihi 80.0046ms

pae kiʻekiʻe: 1048576
maxEvenDividing hopena: 1048574 lōʻihi 109.0063ms
hopena maxEvenDividing2: 1048574 lōʻihi 80.0045ms
hopena maxEvenConjunction: 1048574 lōʻihi 114.0066ms
hopena maxEvenConjunction2: 1048574 lōʻihi 78.0044ms

pae kiʻekiʻe: 2097152
maxEvenDividing hopena: 2097150 lōʻihi 111.0064ms
hopena maxEvenDividing2: 2097150 lōʻihi 79.0045ms
hopena maxEvenConjunction: 2097150 lōʻihi 112.0064ms
hopena maxEvenConjunction2: 2097150 lōʻihi 77.0044ms

pae kiʻekiʻe: 4194304
maxEvenDividing hopena: 4194302 lōʻihi 111.0063ms
hopena maxEvenDividing2: 4194302 lōʻihi 78.0045ms
hopena maxEvenConjunction: 4194302 lōʻihi 111.0063ms
hopena maxEvenConjunction2: 4194302 lōʻihi 77.0044ms

pae kiʻekiʻe: 8388608
maxEvenDividing hopena: 8388606 lōʻihi 109.0062ms
hopena maxEvenDividing2: 8388606 lōʻihi 78.0045ms
hopena maxEvenConjunction: 8388606 lōʻihi 114.0065ms
hopena maxEvenConjunction2: 8388606 lōʻihi 78.0045ms

pae kiʻekiʻe: 16777216
maxEvenDividing hopena: 16777214 lōʻihi 109.0062ms
hopena maxEvenDividing2: 16777214 lōʻihi 77.0044ms
hopena maxEvenConjunction: 16777214 lōʻihi 109.0063ms
hopena maxEvenConjunction2: 16777214 lōʻihi 77.0044ms

pae kiʻekiʻe: 33554432
maxEvenDividing hopena: 33554430 lōʻihi 113.0065ms
hopena maxEvenDividing2: 33554430 lōʻihi 78.0045ms
hopena maxEvenConjunction: 33554430 lōʻihi 110.0063ms
hopena maxEvenConjunction2: 33554430 lōʻihi 80.0045ms

pae kiʻekiʻe: 67108864
maxEvenDividing hopena: 67108860 lōʻihi 112.0064ms
hopena maxEvenDividing2: 67108860 lōʻihi 77.0044ms
hopena maxEvenConjunction: 67108860 lōʻihi 112.0064ms
hopena maxEvenConjunction2: 67108860 lōʻihi 80.0046ms

pae kiʻekiʻe: 134217728
maxEvenDividing hopena: 134217726 lōʻihi 109.0063ms
hopena maxEvenDividing2: 134217726 lōʻihi 78.0044ms
hopena maxEvenConjunction: 134217726 lōʻihi 114.0065ms
hopena maxEvenConjunction2: 134217726 lōʻihi 81.0047ms

pae kiʻekiʻe: 268435456
maxEvenDividing hopena: 268435446 lōʻihi 111.0064ms
hopena maxEvenDividing2: 268435446 lōʻihi 79.0045ms
hopena maxEvenConjunction: 268435446 lōʻihi 114.0065ms
hopena maxEvenConjunction2: 268435446 lōʻihi 79.0045ms

pae kiʻekiʻe: 536870912
maxEvenDividing hopena: 536870910 lōʻihi 107.0062ms
hopena maxEvenDividing2: 536870910 lōʻihi 76.0043ms
hopena maxEvenConjunction: 536870910 lōʻihi 109.0062ms
hopena maxEvenConjunction2: 536870910 lōʻihi 80.0046ms

ʻAʻole hiki iaʻu ke ʻike i ka wehewehe maopopo ʻana i ke kumu ʻaʻole i hoʻopaʻa pono ka Go compiler i ke code a nānā mau i ke kūlana ʻelua, ʻoiai inā he hewa ka mea mua. A i ʻole paha ua pohu wale koʻu mau maka a ʻaʻole au i ʻike i kekahi kuhi hewa? A i ʻole pono ʻoe e hāʻawi i kekahi mau ʻōlelo kuhikuhi kūikawā i ka mea hoʻopili? E hauʻoli wau no nā ʻōlelo kūpono.

PS: ʻAe, no ka leʻaleʻa, holo wau i nā hoʻokolohua like ma Java 5 a me Java 7/8 - ua maopopo nā mea āpau, ua like ka manawa hoʻokō.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka