Tulaga i Go ma latou uiga

E te manatu o nei filifiliga e lua mo le suʻeina o tulaga i totonu o se matasele e tutusa ma le faʻatinoga?

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


Na amata uma lava i le "faamafanafanaina o le fai'ai"; Sa tatau ona ou tuuina atu se faataitaiga o se sailiga sili ona lelei mo le numera tele tele i se faasologa o numera [-x....x]. Sa ou mafaufau pe o le a le sili atu le lelei o le faatinoga pe a ou faʻaogaina le faʻateleina faʻatatau i le 1 e iloa ai pe o se numera e tutusa pe leai.


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

O loʻu poto masani i polokalame i Go e le tele tele, naʻo le silia ma le tausaga ma le afa, na ou faʻaaogaina, e ui lava e masani, ae mama mo faʻaoga faʻaoga (lelei, atonu sei vagana ai se tasi o poloketi e fesoʻotaʻi ma se tautua http maualuga), o lea na ou na amata ai. Tatala GoLand ma tusi se suega faigofie


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
}

Matou te maua se faʻaiʻuga e faʻaalia ai o le maualuga o le faitotoʻa, o le tele foi lea o fesuiaiga o faʻatinoga e aliali mai.

Faatusatusamax 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

E manino lava i lenei tulaga, mo tulaga eseese o loʻo i ai a matou seti eseese o faʻamaumauga o suʻega, o le uta o le gaosiga (i luga o laʻu komepiuta i5-2540M) e fesuisuiaʻi i le 20..30%, o le manatua o loʻo nofoia e le talosaga o loʻo tamoe mai GoLand o le averesi. e uiga i le 813MB - e aʻafia ai foi le faʻamaoni o le taunuuga, e tatau ona e faʻasaoina mataupu suʻega i luga o le disk ma faʻataʻitaʻi uma suʻega mo taʻaloga taʻitasi i le vavae ese mai le tasi ma le isi.

Ma o lenei, mafaufau pe faʻapefea ona faʻatino nei mea uma i tau maualalo, ou te otometi lava ona faʻasaʻo le siakiina o tulaga

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

i

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

Ou te toe faia suʻega ... ma ou te le toe malamalama i se mea :)

O le taimi e fa'aalu i le fa'ataunu'uga ua amata ona 'ese'ese i pasene/vaega o le pasene, ae o le 10..15%. E vave fa'aopoopo 2 isi su'ega:

		
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
}

Ou te tamoe ma maua le ata lenei:fa'asologa muamua gafatia: 100000000

pito maualuga: 128
maxEvenDividing i'uga: 126 umi 116.0066ms
maxEvenDividing2 i'uga: 126 umi 79.0045ms
i'uga maxEvenConjunction: 126 umi 114.0065ms
maxEvenConjunction2 i'uga: 126 umi 83.0048ms

pito maualuga: 256
maxEvenDividing i'uga: 254 umi 111.0063ms
maxEvenDividing2 i'uga: 254 umi 77.0044ms
i'uga maxEvenConjunction: 254 umi 110.0063ms
maxEvenConjunction2 i'uga: 254 umi 80.0046ms

pito maualuga: 512
maxEvenDividing i'uga: 510 umi 114.0066ms
maxEvenDividing2 i'uga: 510 umi 80.0045ms
i'uga maxEvenConjunction: 510 umi 110.0063ms
maxEvenConjunction2 i'uga: 510 umi 80.0046ms

pito maualuga: 1024
maxEvenDividing i'uga: 1022 umi 109.0063ms
maxEvenDividing2 i'uga: 1022 umi 77.0044ms
i'uga maxEvenConjunction: 1022 umi 111.0063ms
maxEvenConjunction2 i'uga: 1022 umi 81.0047ms

pito maualuga: 2048
maxEvenDividing i'uga: 2046 umi 114.0065ms
maxEvenDividing2 i'uga: 2046 umi 79.0045ms
i'uga maxEvenConjunction: 2046 umi 113.0065ms
maxEvenConjunction2 i'uga: 2046 umi 81.0046ms

pito maualuga: 4096
maxEvenDividing i'uga: 4094 umi 114.0065ms
maxEvenDividing2 i'uga: 4094 umi 80.0046ms
i'uga maxEvenConjunction: 4094 umi 111.0063ms
maxEvenConjunction2 i'uga: 4094 umi 78.0045ms

pito maualuga: 8192
maxEvenDividing i'uga: 8190 umi 107.0062ms
maxEvenDividing2 i'uga: 8190 umi 77.0044ms
i'uga maxEvenConjunction: 8190 umi 111.0063ms
maxEvenConjunction2 i'uga: 8190 umi 77.0044ms

pito maualuga: 16384
maxEvenDividing i'uga: 16382 umi 109.0063ms
maxEvenDividing2 i'uga: 16382 umi 77.0044ms
i'uga maxEvenConjunction: 16382 umi 108.0062ms
maxEvenConjunction2 i'uga: 16382 umi 77.0044ms

pito maualuga: 32768
maxEvenDividing i'uga: 32766 umi 112.0064ms
maxEvenDividing2 i'uga: 32766 umi 77.0044ms
i'uga maxEvenConjunction: 32766 umi 109.0062ms
maxEvenConjunction2 i'uga: 32766 umi 78.0045ms

pito maualuga: 65536
maxEvenDividing i'uga: 65534 umi 109.0062ms
maxEvenDividing2 i'uga: 65534 umi 75.0043ms
i'uga maxEvenConjunction: 65534 umi 109.0063ms
maxEvenConjunction2 i'uga: 65534 umi 79.0045ms

pito maualuga: 131072
maxEvenDividing i'uga: 131070 umi 108.0061ms
maxEvenDividing2 i'uga: 131070 umi 76.0044ms
i'uga maxEvenConjunction: 131070 umi 110.0063ms
maxEvenConjunction2 i'uga: 131070 umi 80.0046ms

pito maualuga: 262144
maxEvenDividing i'uga: 262142 umi 110.0063ms
maxEvenDividing2 i'uga: 262142 umi 76.0044ms
i'uga maxEvenConjunction: 262142 umi 107.0061ms
maxEvenConjunction2 i'uga: 262142 umi 78.0044ms

pito maualuga: 524288
maxEvenDividing i'uga: 524286 umi 109.0062ms
maxEvenDividing2 i'uga: 524286 umi 78.0045ms
i'uga maxEvenConjunction: 524286 umi 109.0062ms
maxEvenConjunction2 i'uga: 524286 umi 80.0046ms

pito maualuga: 1048576
maxEvenDividing i'uga: 1048574 umi 109.0063ms
maxEvenDividing2 i'uga: 1048574 umi 80.0045ms
i'uga maxEvenConjunction: 1048574 umi 114.0066ms
maxEvenConjunction2 i'uga: 1048574 umi 78.0044ms

pito maualuga: 2097152
maxEvenDividing i'uga: 2097150 umi 111.0064ms
maxEvenDividing2 i'uga: 2097150 umi 79.0045ms
i'uga maxEvenConjunction: 2097150 umi 112.0064ms
maxEvenConjunction2 i'uga: 2097150 umi 77.0044ms

pito maualuga: 4194304
maxEvenDividing i'uga: 4194302 umi 111.0063ms
maxEvenDividing2 i'uga: 4194302 umi 78.0045ms
i'uga maxEvenConjunction: 4194302 umi 111.0063ms
maxEvenConjunction2 i'uga: 4194302 umi 77.0044ms

pito maualuga: 8388608
maxEvenDividing i'uga: 8388606 umi 109.0062ms
maxEvenDividing2 i'uga: 8388606 umi 78.0045ms
i'uga maxEvenConjunction: 8388606 umi 114.0065ms
maxEvenConjunction2 i'uga: 8388606 umi 78.0045ms

pito maualuga: 16777216
maxEvenDividing i'uga: 16777214 umi 109.0062ms
maxEvenDividing2 i'uga: 16777214 umi 77.0044ms
i'uga maxEvenConjunction: 16777214 umi 109.0063ms
maxEvenConjunction2 i'uga: 16777214 umi 77.0044ms

pito maualuga: 33554432
maxEvenDividing i'uga: 33554430 umi 113.0065ms
maxEvenDividing2 i'uga: 33554430 umi 78.0045ms
i'uga maxEvenConjunction: 33554430 umi 110.0063ms
maxEvenConjunction2 i'uga: 33554430 umi 80.0045ms

pito maualuga: 67108864
maxEvenDividing i'uga: 67108860 umi 112.0064ms
maxEvenDividing2 i'uga: 67108860 umi 77.0044ms
i'uga maxEvenConjunction: 67108860 umi 112.0064ms
maxEvenConjunction2 i'uga: 67108860 umi 80.0046ms

pito maualuga: 134217728
maxEvenDividing i'uga: 134217726 umi 109.0063ms
maxEvenDividing2 i'uga: 134217726 umi 78.0044ms
i'uga maxEvenConjunction: 134217726 umi 114.0065ms
maxEvenConjunction2 i'uga: 134217726 umi 81.0047ms

pito maualuga: 268435456
maxEvenDividing i'uga: 268435446 umi 111.0064ms
maxEvenDividing2 i'uga: 268435446 umi 79.0045ms
i'uga maxEvenConjunction: 268435446 umi 114.0065ms
maxEvenConjunction2 i'uga: 268435446 umi 79.0045ms

pito maualuga: 536870912
maxEvenDividing i'uga: 536870910 umi 107.0062ms
maxEvenDividing2 i'uga: 536870910 umi 76.0043ms
i'uga maxEvenConjunction: 536870910 umi 109.0062ms
maxEvenConjunction2 i'uga: 536870910 umi 80.0046ms

E le mafai ona ou mauaina se faʻamatalaga manino pe aisea e le faʻaogaina ai e le Go compiler le code ma siaki i taimi uma le tulaga lona lua, e tusa lava pe sese le muamua. Pe atonu ua na o le faanenefu o oʻu mata ma ou te le iloa se mea sese? Pe e te manaʻomia e tuʻuina atu ni faʻatonuga faʻapitoa i le tagata faʻapipiʻi? O le a ou fiafia mo ni faamatalaga talafeagai.

PS: Ioe, mo naʻo le malie, sa ou faia ni suʻega tutusa i Java 5 ma Java 7/8 - o loʻo manino mea uma, o le taimi o le faʻatinoga e tutusa.

puna: www.habr.com

Faaopoopo i ai se faamatalaga