Mga kahimtang sa Go ug ang ilang katingad-an

Sa imong hunahuna kini nga duha ka mga kapilian alang sa pagsulay sa mga kondisyon sa sulod sa usa ka loop katumbas sa pasundayag?

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


Nagsugod ang tanan sa usa ka "pag-init sa utok"; Kinahanglan kong maghatag usa ka pananglitan sa usa ka labing maayo nga pagpangita alang sa pinakadako nga even nga numero sa usa ka han-ay sa mga integer [-x....x]. Naghunahuna ko kung unsa ang mas maayo nga performance kung akong gigamit ang lohikal nga pagpadaghan sa 1 aron mahibal-an kung ang usa ka numero parehas o dili.


//Ρƒ Ρ‡Π΅Ρ‚Π½Ρ‹Ρ… чисСл послСдний Π±ΠΈΡ‚ всСгда Ρ€Π°Π²Π΅Π½ 0
value & 1 == 0
//vs классичСский ΠΌΠ΅Ρ‚ΠΎΠ΄
value % 2 == 0

Ang akong kasinatian sa programming sa Go dili kaayo halapad, sobra lang sa usa ka tuig ug tunga, gigamit nako kini, bisan kung kanunay, apan alang ra sa mga katuyoan sa utilitarian (maayo, tingali gawas sa usa ka proyekto nga adunay kalabotan sa usa ka serbisyo sa high-load nga http), mao nga ako nagsugod niini. Ablihi ang GoLand ug pagsulat og yano nga pagsulay


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
}

Nakakuha kami usa ka resulta nga nagpakita nga kung mas taas ang threshold, mas kanunay nga pag-usab-usab sa pasundayag ang makita.

Itandimax 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

Kini mao ang tin-aw nga sa niini nga kaso, alang sa lain-laing mga thresholds kita adunay lain-laing mga set sa pagsulay data, ang processor load (sa akong i5-2540M laptop) lain-laing mga sa palibot sa 20..30%, ang panumduman nga okupar sa aplikasyon nga nagdagan gikan sa GoLand anaa sa aberids. mahitungod sa 813MB - kini usab makaapekto sa pagkakasaligan sa resulta, kinahanglan nimo nga i-save ang mga kaso sa pagsulay sa disk ug ipadagan ang tanan nga mga pagsulay alang sa matag threshold nga nahimulag gikan sa usag usa.

Ug karon, naghunahuna kung unsaon pagpatuman ang tanan niini nga adunay gamay nga gasto, awtomatiko nako nga gitul-id ang pagsusi sa kondisyon

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

sa

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

Gipadagan nako ang mga pagsulay pag-usab ... ug mihunong ako sa pagsabut sa bisan unsa :)

Ang oras nga gigugol sa pagpatay nagsugod sa pagkalahi dili na sa mga porsyento/mga tipik sa usa ka porsyento, kondili sa 10..15%.Dali-dali kong nagdugang ug 2 pa ka pagsulay:

		
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
}

Gidagan ko kini ug gikuha kini nga litrato:inisyal nga kapasidad sa laray: 100000000

maximum nga sukdanan: 128
maxEvenDividing nga resulta: 126 gidugayon 116.0066ms
maxEvenDividing2 nga resulta: 126 gidugayon 79.0045ms
maxEvenConjunction nga resulta: 126 gidugayon 114.0065ms
maxEvenConjunction2 nga resulta: 126 gidugayon 83.0048ms

maximum nga sukdanan: 256
maxEvenDividing nga resulta: 254 gidugayon 111.0063ms
maxEvenDividing2 nga resulta: 254 gidugayon 77.0044ms
maxEvenConjunction nga resulta: 254 gidugayon 110.0063ms
maxEvenConjunction2 nga resulta: 254 gidugayon 80.0046ms

maximum nga sukdanan: 512
maxEvenDividing nga resulta: 510 gidugayon 114.0066ms
maxEvenDividing2 nga resulta: 510 gidugayon 80.0045ms
maxEvenConjunction nga resulta: 510 gidugayon 110.0063ms
maxEvenConjunction2 nga resulta: 510 gidugayon 80.0046ms

maximum nga sukdanan: 1024
maxEvenDividing nga resulta: 1022 gidugayon 109.0063ms
maxEvenDividing2 nga resulta: 1022 gidugayon 77.0044ms
maxEvenConjunction nga resulta: 1022 gidugayon 111.0063ms
maxEvenConjunction2 nga resulta: 1022 gidugayon 81.0047ms

maximum nga sukdanan: 2048
maxEvenDividing nga resulta: 2046 gidugayon 114.0065ms
maxEvenDividing2 nga resulta: 2046 gidugayon 79.0045ms
maxEvenConjunction nga resulta: 2046 gidugayon 113.0065ms
maxEvenConjunction2 nga resulta: 2046 gidugayon 81.0046ms

maximum nga sukdanan: 4096
maxEvenDividing nga resulta: 4094 gidugayon 114.0065ms
maxEvenDividing2 nga resulta: 4094 gidugayon 80.0046ms
maxEvenConjunction nga resulta: 4094 gidugayon 111.0063ms
maxEvenConjunction2 nga resulta: 4094 gidugayon 78.0045ms

maximum nga sukdanan: 8192
maxEvenDividing nga resulta: 8190 gidugayon 107.0062ms
maxEvenDividing2 nga resulta: 8190 gidugayon 77.0044ms
maxEvenConjunction nga resulta: 8190 gidugayon 111.0063ms
maxEvenConjunction2 nga resulta: 8190 gidugayon 77.0044ms

maximum nga sukdanan: 16384
maxEvenDividing nga resulta: 16382 gidugayon 109.0063ms
maxEvenDividing2 nga resulta: 16382 gidugayon 77.0044ms
maxEvenConjunction nga resulta: 16382 gidugayon 108.0062ms
maxEvenConjunction2 nga resulta: 16382 gidugayon 77.0044ms

maximum nga sukdanan: 32768
maxEvenDividing nga resulta: 32766 gidugayon 112.0064ms
maxEvenDividing2 nga resulta: 32766 gidugayon 77.0044ms
maxEvenConjunction nga resulta: 32766 gidugayon 109.0062ms
maxEvenConjunction2 nga resulta: 32766 gidugayon 78.0045ms

maximum nga sukdanan: 65536
maxEvenDividing nga resulta: 65534 gidugayon 109.0062ms
maxEvenDividing2 nga resulta: 65534 gidugayon 75.0043ms
maxEvenConjunction nga resulta: 65534 gidugayon 109.0063ms
maxEvenConjunction2 nga resulta: 65534 gidugayon 79.0045ms

maximum nga sukdanan: 131072
maxEvenDividing nga resulta: 131070 gidugayon 108.0061ms
maxEvenDividing2 nga resulta: 131070 gidugayon 76.0044ms
maxEvenConjunction nga resulta: 131070 gidugayon 110.0063ms
maxEvenConjunction2 nga resulta: 131070 gidugayon 80.0046ms

maximum nga sukdanan: 262144
maxEvenDividing nga resulta: 262142 gidugayon 110.0063ms
maxEvenDividing2 nga resulta: 262142 gidugayon 76.0044ms
maxEvenConjunction nga resulta: 262142 gidugayon 107.0061ms
maxEvenConjunction2 nga resulta: 262142 gidugayon 78.0044ms

maximum nga sukdanan: 524288
maxEvenDividing nga resulta: 524286 gidugayon 109.0062ms
maxEvenDividing2 nga resulta: 524286 gidugayon 78.0045ms
maxEvenConjunction nga resulta: 524286 gidugayon 109.0062ms
maxEvenConjunction2 nga resulta: 524286 gidugayon 80.0046ms

maximum nga sukdanan: 1048576
maxEvenDividing nga resulta: 1048574 gidugayon 109.0063ms
maxEvenDividing2 nga resulta: 1048574 gidugayon 80.0045ms
maxEvenConjunction nga resulta: 1048574 gidugayon 114.0066ms
maxEvenConjunction2 nga resulta: 1048574 gidugayon 78.0044ms

maximum nga sukdanan: 2097152
maxEvenDividing nga resulta: 2097150 gidugayon 111.0064ms
maxEvenDividing2 nga resulta: 2097150 gidugayon 79.0045ms
maxEvenConjunction nga resulta: 2097150 gidugayon 112.0064ms
maxEvenConjunction2 nga resulta: 2097150 gidugayon 77.0044ms

maximum nga sukdanan: 4194304
maxEvenDividing nga resulta: 4194302 gidugayon 111.0063ms
maxEvenDividing2 nga resulta: 4194302 gidugayon 78.0045ms
maxEvenConjunction nga resulta: 4194302 gidugayon 111.0063ms
maxEvenConjunction2 nga resulta: 4194302 gidugayon 77.0044ms

maximum nga sukdanan: 8388608
maxEvenDividing nga resulta: 8388606 gidugayon 109.0062ms
maxEvenDividing2 nga resulta: 8388606 gidugayon 78.0045ms
maxEvenConjunction nga resulta: 8388606 gidugayon 114.0065ms
maxEvenConjunction2 nga resulta: 8388606 gidugayon 78.0045ms

maximum nga sukdanan: 16777216
maxEvenDividing nga resulta: 16777214 gidugayon 109.0062ms
maxEvenDividing2 nga resulta: 16777214 gidugayon 77.0044ms
maxEvenConjunction nga resulta: 16777214 gidugayon 109.0063ms
maxEvenConjunction2 nga resulta: 16777214 gidugayon 77.0044ms

maximum nga sukdanan: 33554432
maxEvenDividing nga resulta: 33554430 gidugayon 113.0065ms
maxEvenDividing2 nga resulta: 33554430 gidugayon 78.0045ms
maxEvenConjunction nga resulta: 33554430 gidugayon 110.0063ms
maxEvenConjunction2 nga resulta: 33554430 gidugayon 80.0045ms

maximum nga sukdanan: 67108864
maxEvenDividing nga resulta: 67108860 gidugayon 112.0064ms
maxEvenDividing2 nga resulta: 67108860 gidugayon 77.0044ms
maxEvenConjunction nga resulta: 67108860 gidugayon 112.0064ms
maxEvenConjunction2 nga resulta: 67108860 gidugayon 80.0046ms

maximum nga sukdanan: 134217728
maxEvenDividing nga resulta: 134217726 gidugayon 109.0063ms
maxEvenDividing2 nga resulta: 134217726 gidugayon 78.0044ms
maxEvenConjunction nga resulta: 134217726 gidugayon 114.0065ms
maxEvenConjunction2 nga resulta: 134217726 gidugayon 81.0047ms

maximum nga sukdanan: 268435456
maxEvenDividing nga resulta: 268435446 gidugayon 111.0064ms
maxEvenDividing2 nga resulta: 268435446 gidugayon 79.0045ms
maxEvenConjunction nga resulta: 268435446 gidugayon 114.0065ms
maxEvenConjunction2 nga resulta: 268435446 gidugayon 79.0045ms

maximum nga sukdanan: 536870912
maxEvenDividing nga resulta: 536870910 gidugayon 107.0062ms
maxEvenDividing2 nga resulta: 536870910 gidugayon 76.0043ms
maxEvenConjunction nga resulta: 536870910 gidugayon 109.0062ms
maxEvenConjunction2 nga resulta: 536870910 gidugayon 80.0046ms

Wala ko makit-an ang tin-aw nga katin-awan ngano nga ang Go compiler wala mag-optimize sa code ug kanunay nga susihon ang ikaduha nga kondisyon, bisan kung ang una sayup. O tingali hanap lang ang akong mga mata ug wala akoy nakita nga klaro nga sayup? O kinahanglan ba nimo nga maghatag pipila ka espesyal nga mga panudlo sa compiler? Malipay ko sa makatarunganon nga mga komento.

PS: Oo, para lang sa kalingawan, nagpadagan ko og susama nga mga pagsulay sa Java 5 ug Java 7/8 - klaro ang tanan, parehas ang oras sa pagpatuman.

Source: www.habr.com

Idugang sa usa ka comment