Ny fepetra ao amin'ny Go sy ny toetrany

Heverinao ve fa mitovy amin'ny zava-bita ve ireo safidy roa ireo amin'ny fitsapana fepetra ao anaty loop?

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


Nanomboka tamin'ny "fanafanana ny ati-doha" izany rehetra izany; Tsy maintsy nanome ohatra momba ny fikarohana tsara indrindra momba ny isa lehibe indrindra amin'ny isa maromaro aho [-x....x]. Nanontany tena aho hoe ohatrinona no mety ho fampisehoana tsara kokoa raha mampiasa fampitomboana lojika amin'ny 1 aho mba hamantarana ny isa iray na tsia.


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

Ny traikefako momba ny fandaharana ao amin'ny Go dia tsy dia mivelatra loatra, mihoatra ny herintaona sy tapany, nampiasa azy io aho, na dia matetika aza, fa natao ho an'ny tanjona utilitarian (tsara, angamba afa-tsy amin'ny tetikasa iray mifandraika amin'ny serivisy http be entana), noho izany aho nanomboka tamin'izany. Sokafy ny GoLand ary manorata fitsapana tsotra


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
}

Mahazo valiny isika izay mampiseho fa arakaraka ny avoakan'ny tokonana no miseho matetika ny fiovaovan'ny zava-bita.

Mampitahamax 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

Mazava fa amin'ity tranga ity, ho an'ny tokonam-baravarana samihafa dia manana angon-drakitra fitsapana samihafa isika, ny enta-mavesatry ny processeur (amin'ny solosainako i5-2540M) dia miovaova manodidina ny 20..30%, ny fitadidiana nofehezin'ny fampiharana mandeha amin'ny GoLand dia eo ho eo. manodidina ny 813MB - izany koa dia misy fiantraikany amin'ny fahamendrehan'ny vokatra, mila mitahiry tranga fitsapana amin'ny kapila ianao ary manatanteraka fitsapana rehetra ho an'ny tokonam-baravarana tsirairay mitokana.

Ary ankehitriny, mieritreritra ny fomba hampiharana izany rehetra izany amin'ny vidiny kely indrindra, manitsy ho azy ny fanamarinana ny fepetra

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

amin'ny

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

Manao ny fitsapana indray aho ... ary tsy mahazo na inona na inona aho :)

Ny fotoana lany amin'ny famonoana dia manomboka tsy mitovy amin'ny isan-jaton'ny isan-jaton'ny isan-jato, fa amin'ny 10..15%. Manampy fitsapana 2 fanampiny haingana aho:

		
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
}

Nihazakazaka aho ary nahazo ity sary ity:fahaiza-manao array voalohany: 100000000

fetra farany ambony: 128
maxEvenDividing valiny: 126 faharetana 116.0066ms
valiny maxEvenDividing2: 126 maharitra 79.0045ms
Valiny maxEvenConjunction: 126 maharitra 114.0065ms
valiny maxEvenConjunction2: 126 maharitra 83.0048ms

fetra farany ambony: 256
maxEvenDividing valiny: 254 faharetana 111.0063ms
valiny maxEvenDividing2: 254 maharitra 77.0044ms
Valiny maxEvenConjunction: 254 maharitra 110.0063ms
valiny maxEvenConjunction2: 254 maharitra 80.0046ms

fetra farany ambony: 512
maxEvenDividing valiny: 510 faharetana 114.0066ms
valiny maxEvenDividing2: 510 maharitra 80.0045ms
Valiny maxEvenConjunction: 510 maharitra 110.0063ms
valiny maxEvenConjunction2: 510 maharitra 80.0046ms

fetra farany ambony: 1024
maxEvenDividing valiny: 1022 faharetana 109.0063ms
valiny maxEvenDividing2: 1022 maharitra 77.0044ms
Valiny maxEvenConjunction: 1022 maharitra 111.0063ms
valiny maxEvenConjunction2: 1022 maharitra 81.0047ms

fetra farany ambony: 2048
maxEvenDividing valiny: 2046 faharetana 114.0065ms
valiny maxEvenDividing2: 2046 maharitra 79.0045ms
Valiny maxEvenConjunction: 2046 maharitra 113.0065ms
valiny maxEvenConjunction2: 2046 maharitra 81.0046ms

fetra farany ambony: 4096
maxEvenDividing valiny: 4094 faharetana 114.0065ms
valiny maxEvenDividing2: 4094 maharitra 80.0046ms
Valiny maxEvenConjunction: 4094 maharitra 111.0063ms
valiny maxEvenConjunction2: 4094 maharitra 78.0045ms

fetra farany ambony: 8192
maxEvenDividing valiny: 8190 faharetana 107.0062ms
valiny maxEvenDividing2: 8190 maharitra 77.0044ms
Valiny maxEvenConjunction: 8190 maharitra 111.0063ms
valiny maxEvenConjunction2: 8190 maharitra 77.0044ms

fetra farany ambony: 16384
maxEvenDividing valiny: 16382 faharetana 109.0063ms
valiny maxEvenDividing2: 16382 maharitra 77.0044ms
Valiny maxEvenConjunction: 16382 maharitra 108.0062ms
valiny maxEvenConjunction2: 16382 maharitra 77.0044ms

fetra farany ambony: 32768
maxEvenDividing valiny: 32766 faharetana 112.0064ms
valiny maxEvenDividing2: 32766 maharitra 77.0044ms
Valiny maxEvenConjunction: 32766 maharitra 109.0062ms
valiny maxEvenConjunction2: 32766 maharitra 78.0045ms

fetra farany ambony: 65536
maxEvenDividing valiny: 65534 faharetana 109.0062ms
valiny maxEvenDividing2: 65534 maharitra 75.0043ms
Valiny maxEvenConjunction: 65534 maharitra 109.0063ms
valiny maxEvenConjunction2: 65534 maharitra 79.0045ms

fetra farany ambony: 131072
maxEvenDividing valiny: 131070 faharetana 108.0061ms
valiny maxEvenDividing2: 131070 maharitra 76.0044ms
Valiny maxEvenConjunction: 131070 maharitra 110.0063ms
valiny maxEvenConjunction2: 131070 maharitra 80.0046ms

fetra farany ambony: 262144
maxEvenDividing valiny: 262142 faharetana 110.0063ms
valiny maxEvenDividing2: 262142 maharitra 76.0044ms
Valiny maxEvenConjunction: 262142 maharitra 107.0061ms
valiny maxEvenConjunction2: 262142 maharitra 78.0044ms

fetra farany ambony: 524288
maxEvenDividing valiny: 524286 faharetana 109.0062ms
valiny maxEvenDividing2: 524286 maharitra 78.0045ms
Valiny maxEvenConjunction: 524286 maharitra 109.0062ms
valiny maxEvenConjunction2: 524286 maharitra 80.0046ms

fetra farany ambony: 1048576
maxEvenDividing valiny: 1048574 faharetana 109.0063ms
valiny maxEvenDividing2: 1048574 maharitra 80.0045ms
Valiny maxEvenConjunction: 1048574 maharitra 114.0066ms
valiny maxEvenConjunction2: 1048574 maharitra 78.0044ms

fetra farany ambony: 2097152
maxEvenDividing valiny: 2097150 faharetana 111.0064ms
valiny maxEvenDividing2: 2097150 maharitra 79.0045ms
Valiny maxEvenConjunction: 2097150 maharitra 112.0064ms
valiny maxEvenConjunction2: 2097150 maharitra 77.0044ms

fetra farany ambony: 4194304
maxEvenDividing valiny: 4194302 faharetana 111.0063ms
valiny maxEvenDividing2: 4194302 maharitra 78.0045ms
Valiny maxEvenConjunction: 4194302 maharitra 111.0063ms
valiny maxEvenConjunction2: 4194302 maharitra 77.0044ms

fetra farany ambony: 8388608
maxEvenDividing valiny: 8388606 faharetana 109.0062ms
valiny maxEvenDividing2: 8388606 maharitra 78.0045ms
Valiny maxEvenConjunction: 8388606 maharitra 114.0065ms
valiny maxEvenConjunction2: 8388606 maharitra 78.0045ms

fetra farany ambony: 16777216
maxEvenDividing valiny: 16777214 faharetana 109.0062ms
valiny maxEvenDividing2: 16777214 maharitra 77.0044ms
Valiny maxEvenConjunction: 16777214 maharitra 109.0063ms
valiny maxEvenConjunction2: 16777214 maharitra 77.0044ms

fetra farany ambony: 33554432
maxEvenDividing valiny: 33554430 faharetana 113.0065ms
valiny maxEvenDividing2: 33554430 maharitra 78.0045ms
Valiny maxEvenConjunction: 33554430 maharitra 110.0063ms
valiny maxEvenConjunction2: 33554430 maharitra 80.0045ms

fetra farany ambony: 67108864
maxEvenDividing valiny: 67108860 faharetana 112.0064ms
valiny maxEvenDividing2: 67108860 maharitra 77.0044ms
Valiny maxEvenConjunction: 67108860 maharitra 112.0064ms
valiny maxEvenConjunction2: 67108860 maharitra 80.0046ms

fetra farany ambony: 134217728
maxEvenDividing valiny: 134217726 faharetana 109.0063ms
valiny maxEvenDividing2: 134217726 maharitra 78.0044ms
Valiny maxEvenConjunction: 134217726 maharitra 114.0065ms
valiny maxEvenConjunction2: 134217726 maharitra 81.0047ms

fetra farany ambony: 268435456
maxEvenDividing valiny: 268435446 faharetana 111.0064ms
valiny maxEvenDividing2: 268435446 maharitra 79.0045ms
Valiny maxEvenConjunction: 268435446 maharitra 114.0065ms
valiny maxEvenConjunction2: 268435446 maharitra 79.0045ms

fetra farany ambony: 536870912
maxEvenDividing valiny: 536870910 faharetana 107.0062ms
valiny maxEvenDividing2: 536870910 maharitra 76.0043ms
Valiny maxEvenConjunction: 536870910 maharitra 109.0062ms
valiny maxEvenConjunction2: 536870910 maharitra 80.0046ms

Tsy nahita fanazavana mazava aho hoe nahoana ny Go compiler no tsy manatsara ny kaody ary manamarina foana ny fepetra faharoa, na dia diso aza ny voalohany. Sa manjavozavo fotsiny ny masoko ka tsy hitako izay fahadisoana miharihary? Sa mila manome toromarika manokana ho an'ny compiler ve ianao? Faly aho amin'ny fanehoan-kevitra matotra.

Sal: Eny, ho an'ny fialamboly fotsiny, nanao fitsapana mitovy amin'izany aho tamin'ny Java 5 sy Java 7/8 - mazava ny zava-drehetra, mitovy ny fotoana famonoana.

Source: www.habr.com

Add a comment