Cov xwm txheej hauv Go thiab lawv qhov quirks

Koj puas xav tias ob qho kev xaiv no rau kev sim cov xwm txheej hauv lub voj voog yog sib npaug hauv kev ua haujlwm?

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


Nws tag nrho pib nrog "lub hlwb warm-up"; Kuv yuav tsum tau muab piv txwv ntawm qhov kev tshawb fawb zoo tshaj plaws rau tus lej loj tshaj plaws hauv ib qho array ntawm cov lej [-x....x]. Kuv xav paub ntau npaum li cas qhov kev ua tau zoo dua yog tias kuv siv cov lej sib npaug los ntawm 1 txhawm rau txheeb xyuas seb tus lej puas yog lossis tsis.


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

Kuv qhov kev paub txog kev ua haujlwm hauv Go tsis yog qhov dav heev, tsuas yog ib xyoos thiab ib nrab xwb, kuv tau siv nws, txawm hais tias feem ntau, tab sis tsuas yog rau cov hom phiaj siv hluav taws xob (zoo, tej zaum tsuas yog rau ib txoj haujlwm ntsig txog kev pabcuam http siab), yog li kuv pib nrog nws. Qhib GoLand thiab sau ib qho kev sim yooj yim


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
}

Peb tau txais ib qho txiaj ntsig uas qhia tau hais tias qhov siab dua qhov pib, qhov ntau qhov kev hloov pauv hauv kev ua tau zoo tshwm sim.

Pivmax 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

Nws yog qhov tseeb hais tias nyob rau hauv cov ntaub ntawv no, rau qhov sib txawv qhov pib peb muaj ntau pawg ntawm cov ntaub ntawv xeem, lub processor load (ntawm kuv i5-2540M laptop) txawv nyob ib ncig ntawm 20..30%, lub cim xeeb nyob ntawm daim ntawv thov khiav ntawm GoLand yog nyob rau hauv nruab nrab. txog 813MB - qhov no kuj tseem cuam tshuam qhov kev ntseeg tau ntawm qhov tshwm sim, koj yuav tsum khaws cov ntaub ntawv xeem ntawm disk thiab khiav txhua qhov kev xeem rau txhua qhov kev sib cais ntawm ib leeg.

Thiab tam sim no, xav txog yuav ua li cas siv tag nrho cov no nrog cov nqi tsawg, kuv tau kho qhov kev kuaj mob

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

rau

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

Kuv khiav qhov kev sim dua ... thiab kuv tsis nkag siab dab tsi :)

Lub sij hawm siv rau kev ua tiav pib sib txawv tsis yog feem pua ​​/ feem ntawm ib feem, tab sis los ntawm 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
}

Kuv khiav nws thiab tau txais daim duab no:pib array peev: 100000000

max qhov siab: 128
maxEvenDividing result: 126 duration 116.0066ms
maxEvenDividing2 tshwm sim: 126 ntev 79.0045ms
maxEvenConjunction result: 126 duration 114.0065ms
maxEvenConjunction2 result: 126 duration 83.0048ms

max qhov siab: 256
maxEvenDividing result: 254 duration 111.0063ms
maxEvenDividing2 tshwm sim: 254 ntev 77.0044ms
maxEvenConjunction result: 254 duration 110.0063ms
maxEvenConjunction2 result: 254 duration 80.0046ms

max qhov siab: 512
maxEvenDividing result: 510 duration 114.0066ms
maxEvenDividing2 tshwm sim: 510 ntev 80.0045ms
maxEvenConjunction result: 510 duration 110.0063ms
maxEvenConjunction2 result: 510 duration 80.0046ms

max qhov siab: 1024
maxEvenDividing result: 1022 duration 109.0063ms
maxEvenDividing2 tshwm sim: 1022 ntev 77.0044ms
maxEvenConjunction result: 1022 duration 111.0063ms
maxEvenConjunction2 result: 1022 duration 81.0047ms

max qhov siab: 2048
maxEvenDividing result: 2046 duration 114.0065ms
maxEvenDividing2 tshwm sim: 2046 ntev 79.0045ms
maxEvenConjunction result: 2046 duration 113.0065ms
maxEvenConjunction2 result: 2046 duration 81.0046ms

max qhov siab: 4096
maxEvenDividing result: 4094 duration 114.0065ms
maxEvenDividing2 tshwm sim: 4094 ntev 80.0046ms
maxEvenConjunction result: 4094 duration 111.0063ms
maxEvenConjunction2 result: 4094 duration 78.0045ms

max qhov siab: 8192
maxEvenDividing result: 8190 duration 107.0062ms
maxEvenDividing2 tshwm sim: 8190 ntev 77.0044ms
maxEvenConjunction result: 8190 duration 111.0063ms
maxEvenConjunction2 result: 8190 duration 77.0044ms

max qhov siab: 16384
maxEvenDividing result: 16382 duration 109.0063ms
maxEvenDividing2 tshwm sim: 16382 ntev 77.0044ms
maxEvenConjunction result: 16382 duration 108.0062ms
maxEvenConjunction2 result: 16382 duration 77.0044ms

max qhov siab: 32768
maxEvenDividing result: 32766 duration 112.0064ms
maxEvenDividing2 tshwm sim: 32766 ntev 77.0044ms
maxEvenConjunction result: 32766 duration 109.0062ms
maxEvenConjunction2 result: 32766 duration 78.0045ms

max qhov siab: 65536
maxEvenDividing result: 65534 duration 109.0062ms
maxEvenDividing2 tshwm sim: 65534 ntev 75.0043ms
maxEvenConjunction result: 65534 duration 109.0063ms
maxEvenConjunction2 result: 65534 duration 79.0045ms

max qhov siab: 131072
maxEvenDividing result: 131070 duration 108.0061ms
maxEvenDividing2 tshwm sim: 131070 ntev 76.0044ms
maxEvenConjunction result: 131070 duration 110.0063ms
maxEvenConjunction2 result: 131070 duration 80.0046ms

max qhov siab: 262144
maxEvenDividing result: 262142 duration 110.0063ms
maxEvenDividing2 tshwm sim: 262142 ntev 76.0044ms
maxEvenConjunction result: 262142 duration 107.0061ms
maxEvenConjunction2 result: 262142 duration 78.0044ms

max qhov siab: 524288
maxEvenDividing result: 524286 duration 109.0062ms
maxEvenDividing2 tshwm sim: 524286 ntev 78.0045ms
maxEvenConjunction result: 524286 duration 109.0062ms
maxEvenConjunction2 result: 524286 duration 80.0046ms

max qhov siab: 1048576
maxEvenDividing result: 1048574 duration 109.0063ms
maxEvenDividing2 tshwm sim: 1048574 ntev 80.0045ms
maxEvenConjunction result: 1048574 duration 114.0066ms
maxEvenConjunction2 result: 1048574 duration 78.0044ms

max qhov siab: 2097152
maxEvenDividing result: 2097150 duration 111.0064ms
maxEvenDividing2 tshwm sim: 2097150 ntev 79.0045ms
maxEvenConjunction result: 2097150 duration 112.0064ms
maxEvenConjunction2 result: 2097150 duration 77.0044ms

max qhov siab: 4194304
maxEvenDividing result: 4194302 duration 111.0063ms
maxEvenDividing2 tshwm sim: 4194302 ntev 78.0045ms
maxEvenConjunction result: 4194302 duration 111.0063ms
maxEvenConjunction2 result: 4194302 duration 77.0044ms

max qhov siab: 8388608
maxEvenDividing result: 8388606 duration 109.0062ms
maxEvenDividing2 tshwm sim: 8388606 ntev 78.0045ms
maxEvenConjunction result: 8388606 duration 114.0065ms
maxEvenConjunction2 result: 8388606 duration 78.0045ms

max qhov siab: 16777216
maxEvenDividing result: 16777214 duration 109.0062ms
maxEvenDividing2 tshwm sim: 16777214 ntev 77.0044ms
maxEvenConjunction result: 16777214 duration 109.0063ms
maxEvenConjunction2 result: 16777214 duration 77.0044ms

max qhov siab: 33554432
maxEvenDividing result: 33554430 duration 113.0065ms
maxEvenDividing2 tshwm sim: 33554430 ntev 78.0045ms
maxEvenConjunction result: 33554430 duration 110.0063ms
maxEvenConjunction2 result: 33554430 duration 80.0045ms

max qhov siab: 67108864
maxEvenDividing result: 67108860 duration 112.0064ms
maxEvenDividing2 tshwm sim: 67108860 ntev 77.0044ms
maxEvenConjunction result: 67108860 duration 112.0064ms
maxEvenConjunction2 result: 67108860 duration 80.0046ms

max qhov siab: 134217728
maxEvenDividing result: 134217726 duration 109.0063ms
maxEvenDividing2 tshwm sim: 134217726 ntev 78.0044ms
maxEvenConjunction result: 134217726 duration 114.0065ms
maxEvenConjunction2 result: 134217726 duration 81.0047ms

max qhov siab: 268435456
maxEvenDividing result: 268435446 duration 111.0064ms
maxEvenDividing2 tshwm sim: 268435446 ntev 79.0045ms
maxEvenConjunction result: 268435446 duration 114.0065ms
maxEvenConjunction2 result: 268435446 duration 79.0045ms

max qhov siab: 536870912
maxEvenDividing result: 536870910 duration 107.0062ms
maxEvenDividing2 tshwm sim: 536870910 ntev 76.0043ms
maxEvenConjunction result: 536870910 duration 109.0062ms
maxEvenConjunction2 result: 536870910 duration 80.0046ms

Kuv tsis tuaj yeem pom cov lus piav qhia meej vim li cas Go compiler tsis ua kom zoo dua cov cai thiab ib txwm kuaj xyuas tus mob thib ob, txawm tias thawj tus tsis muaj tseeb. Los yog tej zaum kuv ob lub qhov muag tsuas yog qhov muag plooj thiab kuv tsis pom qhov yuam kev? Lossis koj puas yuav tsum tau muab qee cov lus qhia tshwj xeeb rau lub compiler? Kuv yuav zoo siab rau cov lus pom zoo.

PS: Yog lawm, tsuas yog kev lom zem xwb, kuv tau khiav cov kev xeem zoo sib xws ntawm Java 5 thiab Java 7/8 - txhua yam yog qhov tseeb, lub sijhawm ua tiav yog tib yam.

Tau qhov twg los: www.hab.com

Ntxiv ib saib