Mikhalidwe mu Go ndi zovuta zawo

Kodi mukuganiza kuti njira ziwirizi zoyeserera zoyeserera mkati mwa loop ndizofanana pakuchita?

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


Zonse zidayamba ndi "kutenthetsa muubongo"; Ndidayenera kupereka chitsanzo chakusaka koyenera kwa nambala yayikulu kwambiri pamndandanda wamagulu [-x ....x]. Ndinali kudabwa kuti kuchita bwino kukanakhala kotani ngati nditagwiritsa ntchito kuchulukitsa momveka bwino ndi 1 kuti ndidziwe ngati nambala ili yofanana kapena ayi.


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

Zomwe ndakumana nazo mu Go sizovuta kwambiri, kupitilira chaka chimodzi ndi theka, ndidazigwiritsa ntchito, ngakhale nthawi zambiri, koma pazolinga zothandizira (chabwino, mwina kupatula pulojekiti imodzi yokhudzana ndi ntchito yayikulu ya http), kotero ine anayamba nazo. Tsegulani GoLand ndikulemba mayeso osavuta


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
}

Timapeza zotsatira zomwe zimasonyeza kuti kumtunda kwa malire, nthawi zambiri kusinthasintha kwa machitidwe kumawonekera.

Fananizanimax 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

Zikuwonekeratu kuti pakadali pano, pamagawo osiyanasiyana tili ndi ma data osiyanasiyana oyesa, kuchuluka kwa purosesa (pa laputopu yanga ya i5-2540M) kumasiyanasiyana pafupifupi 20..30%, kukumbukira komwe kumagwira ntchito kuchokera ku GoLand kuli pafupifupi. pafupifupi 813MB - izi zimakhudzanso kudalirika kwa zotsatira, muyenera kupulumutsa milandu yoyeserera pa litayamba ndikuyesa mayeso onse pamlingo uliwonse kudzipatula kwa wina ndi mnzake.

Ndipo tsopano, poganizira momwe ndingagwiritsire ntchito zonsezi ndi ndalama zochepa, ndimangokonza cheke

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

pa

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

Ndimayesanso mayeso ... ndipo ndimasiya kumvetsetsa chilichonse :)

Nthawi yogwiritsidwa ntchito pakupha imayamba kusiyana osatinso ndi magawo / magawo a peresenti, koma ndi 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
}

Ndikuyendetsa ndikupeza chithunzi ichi:kuchuluka koyambira: 100000000

Chiwerengero chachikulu: 128
maxEvenKugawanika zotsatira: 126 nthawi 116.0066ms
maxEvenDividing2 zotsatira: 126 nthawi 79.0045ms
zotsatira za maxEvenConjunction: 126 nthawi 114.0065ms
zotsatira za maxEvenConjunction2: nthawi ya 126 83.0048ms

Chiwerengero chachikulu: 256
maxEvenKugawanika zotsatira: 254 nthawi 111.0063ms
maxEvenDividing2 zotsatira: 254 nthawi 77.0044ms
zotsatira za maxEvenConjunction: 254 nthawi 110.0063ms
zotsatira za maxEvenConjunction2: nthawi ya 254 80.0046ms

Chiwerengero chachikulu: 512
maxEvenKugawanika zotsatira: 510 nthawi 114.0066ms
maxEvenDividing2 zotsatira: 510 nthawi 80.0045ms
zotsatira za maxEvenConjunction: 510 nthawi 110.0063ms
zotsatira za maxEvenConjunction2: nthawi ya 510 80.0046ms

Chiwerengero chachikulu: 1024
maxEvenKugawanika zotsatira: 1022 nthawi 109.0063ms
maxEvenDividing2 zotsatira: 1022 nthawi 77.0044ms
zotsatira za maxEvenConjunction: 1022 nthawi 111.0063ms
zotsatira za maxEvenConjunction2: nthawi ya 1022 81.0047ms

Chiwerengero chachikulu: 2048
maxEvenKugawanika zotsatira: 2046 nthawi 114.0065ms
maxEvenDividing2 zotsatira: 2046 nthawi 79.0045ms
zotsatira za maxEvenConjunction: 2046 nthawi 113.0065ms
zotsatira za maxEvenConjunction2: nthawi ya 2046 81.0046ms

Chiwerengero chachikulu: 4096
maxEvenKugawanika zotsatira: 4094 nthawi 114.0065ms
maxEvenDividing2 zotsatira: 4094 nthawi 80.0046ms
zotsatira za maxEvenConjunction: 4094 nthawi 111.0063ms
zotsatira za maxEvenConjunction2: nthawi ya 4094 78.0045ms

Chiwerengero chachikulu: 8192
maxEvenKugawanika zotsatira: 8190 nthawi 107.0062ms
maxEvenDividing2 zotsatira: 8190 nthawi 77.0044ms
zotsatira za maxEvenConjunction: 8190 nthawi 111.0063ms
zotsatira za maxEvenConjunction2: nthawi ya 8190 77.0044ms

Chiwerengero chachikulu: 16384
maxEvenKugawanika zotsatira: 16382 nthawi 109.0063ms
maxEvenDividing2 zotsatira: 16382 nthawi 77.0044ms
zotsatira za maxEvenConjunction: 16382 nthawi 108.0062ms
zotsatira za maxEvenConjunction2: nthawi ya 16382 77.0044ms

Chiwerengero chachikulu: 32768
maxEvenKugawanika zotsatira: 32766 nthawi 112.0064ms
maxEvenDividing2 zotsatira: 32766 nthawi 77.0044ms
zotsatira za maxEvenConjunction: 32766 nthawi 109.0062ms
zotsatira za maxEvenConjunction2: nthawi ya 32766 78.0045ms

Chiwerengero chachikulu: 65536
maxEvenKugawanika zotsatira: 65534 nthawi 109.0062ms
maxEvenDividing2 zotsatira: 65534 nthawi 75.0043ms
zotsatira za maxEvenConjunction: 65534 nthawi 109.0063ms
zotsatira za maxEvenConjunction2: nthawi ya 65534 79.0045ms

Chiwerengero chachikulu: 131072
maxEvenKugawanika zotsatira: 131070 nthawi 108.0061ms
maxEvenDividing2 zotsatira: 131070 nthawi 76.0044ms
zotsatira za maxEvenConjunction: 131070 nthawi 110.0063ms
zotsatira za maxEvenConjunction2: nthawi ya 131070 80.0046ms

Chiwerengero chachikulu: 262144
maxEvenKugawanika zotsatira: 262142 nthawi 110.0063ms
maxEvenDividing2 zotsatira: 262142 nthawi 76.0044ms
zotsatira za maxEvenConjunction: 262142 nthawi 107.0061ms
zotsatira za maxEvenConjunction2: nthawi ya 262142 78.0044ms

Chiwerengero chachikulu: 524288
maxEvenKugawanika zotsatira: 524286 nthawi 109.0062ms
maxEvenDividing2 zotsatira: 524286 nthawi 78.0045ms
zotsatira za maxEvenConjunction: 524286 nthawi 109.0062ms
zotsatira za maxEvenConjunction2: nthawi ya 524286 80.0046ms

Chiwerengero chachikulu: 1048576
maxEvenKugawanika zotsatira: 1048574 nthawi 109.0063ms
maxEvenDividing2 zotsatira: 1048574 nthawi 80.0045ms
zotsatira za maxEvenConjunction: 1048574 nthawi 114.0066ms
zotsatira za maxEvenConjunction2: nthawi ya 1048574 78.0044ms

Chiwerengero chachikulu: 2097152
maxEvenKugawanika zotsatira: 2097150 nthawi 111.0064ms
maxEvenDividing2 zotsatira: 2097150 nthawi 79.0045ms
zotsatira za maxEvenConjunction: 2097150 nthawi 112.0064ms
zotsatira za maxEvenConjunction2: nthawi ya 2097150 77.0044ms

Chiwerengero chachikulu: 4194304
maxEvenKugawanika zotsatira: 4194302 nthawi 111.0063ms
maxEvenDividing2 zotsatira: 4194302 nthawi 78.0045ms
zotsatira za maxEvenConjunction: 4194302 nthawi 111.0063ms
zotsatira za maxEvenConjunction2: nthawi ya 4194302 77.0044ms

Chiwerengero chachikulu: 8388608
maxEvenKugawanika zotsatira: 8388606 nthawi 109.0062ms
maxEvenDividing2 zotsatira: 8388606 nthawi 78.0045ms
zotsatira za maxEvenConjunction: 8388606 nthawi 114.0065ms
zotsatira za maxEvenConjunction2: nthawi ya 8388606 78.0045ms

Chiwerengero chachikulu: 16777216
maxEvenKugawanika zotsatira: 16777214 nthawi 109.0062ms
maxEvenDividing2 zotsatira: 16777214 nthawi 77.0044ms
zotsatira za maxEvenConjunction: 16777214 nthawi 109.0063ms
zotsatira za maxEvenConjunction2: nthawi ya 16777214 77.0044ms

Chiwerengero chachikulu: 33554432
maxEvenKugawanika zotsatira: 33554430 nthawi 113.0065ms
maxEvenDividing2 zotsatira: 33554430 nthawi 78.0045ms
zotsatira za maxEvenConjunction: 33554430 nthawi 110.0063ms
zotsatira za maxEvenConjunction2: nthawi ya 33554430 80.0045ms

Chiwerengero chachikulu: 67108864
maxEvenKugawanika zotsatira: 67108860 nthawi 112.0064ms
maxEvenDividing2 zotsatira: 67108860 nthawi 77.0044ms
zotsatira za maxEvenConjunction: 67108860 nthawi 112.0064ms
zotsatira za maxEvenConjunction2: nthawi ya 67108860 80.0046ms

Chiwerengero chachikulu: 134217728
maxEvenKugawanika zotsatira: 134217726 nthawi 109.0063ms
maxEvenDividing2 zotsatira: 134217726 nthawi 78.0044ms
zotsatira za maxEvenConjunction: 134217726 nthawi 114.0065ms
zotsatira za maxEvenConjunction2: nthawi ya 134217726 81.0047ms

Chiwerengero chachikulu: 268435456
maxEvenKugawanika zotsatira: 268435446 nthawi 111.0064ms
maxEvenDividing2 zotsatira: 268435446 nthawi 79.0045ms
zotsatira za maxEvenConjunction: 268435446 nthawi 114.0065ms
zotsatira za maxEvenConjunction2: nthawi ya 268435446 79.0045ms

Chiwerengero chachikulu: 536870912
maxEvenKugawanika zotsatira: 536870910 nthawi 107.0062ms
maxEvenDividing2 zotsatira: 536870910 nthawi 76.0043ms
zotsatira za maxEvenConjunction: 536870910 nthawi 109.0062ms
zotsatira za maxEvenConjunction2: nthawi ya 536870910 80.0046ms

Sindinapeze kufotokozera momveka bwino chifukwa chake Go compiler samakulitsa kachidindoyo ndipo nthawi zonse amayang'ana zachiwiri, ngakhale woyambayo ndi wabodza. Kapena mwina maso anga akungothothoka ndipo sindikuwona cholakwika chilichonse? Kapena mukuyenera kupereka malangizo apadera kwa wopanga? Ndikufuna ndemanga zomveka.

PS: Inde, kuti ndingosangalala, ndinayesa mayesero ofanana pa Java 5 ndi Java 7/8 - chirichonse chiri chomveka, nthawi yophedwa ndi yofanana.

Source: www.habr.com

Kuwonjezera ndemanga