Maemo ho Go le quirks bona

Na u nahana hore likhetho tsee tse peli bakeng sa maemo a liteko ka har'a lupu li lekana ts'ebetsong?

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


Tsohle li qalile ka "ho futhumatsa boko"; ke ile ka tlameha ho fana ka mohlala oa patlisiso e nepahetseng bakeng sa palo e kholo ka ho fetisisa ea palo e felletseng [-x....x]. Ke ne ke ipotsa hore na ts'ebetso e tla ba betere hakae ha nka sebelisa katiso e utloahalang ka 1 ho fumana hore na palo e lekana kapa che.


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

Phihlelo ea ka ea lenaneo ho Go ha e ngata haholo, nako e fetang selemo le halofo, ke ile ka e sebelisa, le hoja hangata, empa bakeng sa merero ea ts'ebeliso (hantle, mohlomong ntle le morero o le mong o amanang le tšebeletso e phahameng ea http), kahoo ke qala ka eona. Bula GoLand mme o ngole teko e bonolo


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
}

Re fumana sephetho se bonts'ang hore ha moeli o phahame, hangata ho fetoha ha maemo a ts'ebetso ho hlaha.

Bapisamax 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

Ho hlakile hore tabeng ena, bakeng sa menyako e fapaneng re na le lihlopha tse fapaneng tsa liteko tsa tlhahlobo, mojaro oa processor (ho laptop ea ka ea i5-2540M) o fapana hoo e ka bang 20..30%, mohopolo o tšoaretsoeng ke kopo e tsoang GoLand ke ka karolelano. hoo e ka bang 813MB - sena se boetse se ama ho tšepahala ha sephetho, o hloka ho boloka linyeoe tsa teko ho disk le ho tsamaisa liteko tsohle bakeng sa monyako o mong le o mong ka thōko ho tse ling.

'Me joale, ha ke nahana ka mokhoa oa ho kenya tšebetsong tsena tsohle ka litšenyehelo tse fokolang, ke lokisa tlhahlobo ea boemo ka bo eona

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

mabapi le

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

Ke matha liteko hape ... 'me ke khaotsa ho utloisisa letho :)

Nako e sebelisitsoeng polaong e qala ho fapana ha e sa hlola e fapana ka liphesente / likaroloana tsa liperesente, empa ka 10..15%. Ka potlako ke eketsa liteko tse ling tse 2:

		
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
}

Kea e matha 'me ke fumana setšoantšo sena:boholo ba sehlopha sa pele: 100000000

moeli o moholo: 128
maxEvenSephetho se arolang: 126 nako 116.0066ms
maxEvenDividing2 sephetho: 126 nako 79.0045ms
maxEvenConjunction sephetho: 126 nako 114.0065ms
maxEvenConjunction2 sephetho: 126 nako 83.0048ms

moeli o moholo: 256
maxEvenSephetho se arolang: 254 nako 111.0063ms
maxEvenDividing2 sephetho: 254 nako 77.0044ms
maxEvenConjunction sephetho: 254 nako 110.0063ms
maxEvenConjunction2 sephetho: 254 nako 80.0046ms

moeli o moholo: 512
maxEvenSephetho se arolang: 510 nako 114.0066ms
maxEvenDividing2 sephetho: 510 nako 80.0045ms
maxEvenConjunction sephetho: 510 nako 110.0063ms
maxEvenConjunction2 sephetho: 510 nako 80.0046ms

moeli o moholo: 1024
maxEvenSephetho se arolang: 1022 nako 109.0063ms
maxEvenDividing2 sephetho: 1022 nako 77.0044ms
maxEvenConjunction sephetho: 1022 nako 111.0063ms
maxEvenConjunction2 sephetho: 1022 nako 81.0047ms

moeli o moholo: 2048
maxEvenSephetho se arolang: 2046 nako 114.0065ms
maxEvenDividing2 sephetho: 2046 nako 79.0045ms
maxEvenConjunction sephetho: 2046 nako 113.0065ms
maxEvenConjunction2 sephetho: 2046 nako 81.0046ms

moeli o moholo: 4096
maxEvenSephetho se arolang: 4094 nako 114.0065ms
maxEvenDividing2 sephetho: 4094 nako 80.0046ms
maxEvenConjunction sephetho: 4094 nako 111.0063ms
maxEvenConjunction2 sephetho: 4094 nako 78.0045ms

moeli o moholo: 8192
maxEvenSephetho se arolang: 8190 nako 107.0062ms
maxEvenDividing2 sephetho: 8190 nako 77.0044ms
maxEvenConjunction sephetho: 8190 nako 111.0063ms
maxEvenConjunction2 sephetho: 8190 nako 77.0044ms

moeli o moholo: 16384
maxEvenSephetho se arolang: 16382 nako 109.0063ms
maxEvenDividing2 sephetho: 16382 nako 77.0044ms
maxEvenConjunction sephetho: 16382 nako 108.0062ms
maxEvenConjunction2 sephetho: 16382 nako 77.0044ms

moeli o moholo: 32768
maxEvenSephetho se arolang: 32766 nako 112.0064ms
maxEvenDividing2 sephetho: 32766 nako 77.0044ms
maxEvenConjunction sephetho: 32766 nako 109.0062ms
maxEvenConjunction2 sephetho: 32766 nako 78.0045ms

moeli o moholo: 65536
maxEvenSephetho se arolang: 65534 nako 109.0062ms
maxEvenDividing2 sephetho: 65534 nako 75.0043ms
maxEvenConjunction sephetho: 65534 nako 109.0063ms
maxEvenConjunction2 sephetho: 65534 nako 79.0045ms

moeli o moholo: 131072
maxEvenSephetho se arolang: 131070 nako 108.0061ms
maxEvenDividing2 sephetho: 131070 nako 76.0044ms
maxEvenConjunction sephetho: 131070 nako 110.0063ms
maxEvenConjunction2 sephetho: 131070 nako 80.0046ms

moeli o moholo: 262144
maxEvenSephetho se arolang: 262142 nako 110.0063ms
maxEvenDividing2 sephetho: 262142 nako 76.0044ms
maxEvenConjunction sephetho: 262142 nako 107.0061ms
maxEvenConjunction2 sephetho: 262142 nako 78.0044ms

moeli o moholo: 524288
maxEvenSephetho se arolang: 524286 nako 109.0062ms
maxEvenDividing2 sephetho: 524286 nako 78.0045ms
maxEvenConjunction sephetho: 524286 nako 109.0062ms
maxEvenConjunction2 sephetho: 524286 nako 80.0046ms

moeli o moholo: 1048576
maxEvenSephetho se arolang: 1048574 nako 109.0063ms
maxEvenDividing2 sephetho: 1048574 nako 80.0045ms
maxEvenConjunction sephetho: 1048574 nako 114.0066ms
maxEvenConjunction2 sephetho: 1048574 nako 78.0044ms

moeli o moholo: 2097152
maxEvenSephetho se arolang: 2097150 nako 111.0064ms
maxEvenDividing2 sephetho: 2097150 nako 79.0045ms
maxEvenConjunction sephetho: 2097150 nako 112.0064ms
maxEvenConjunction2 sephetho: 2097150 nako 77.0044ms

moeli o moholo: 4194304
maxEvenSephetho se arolang: 4194302 nako 111.0063ms
maxEvenDividing2 sephetho: 4194302 nako 78.0045ms
maxEvenConjunction sephetho: 4194302 nako 111.0063ms
maxEvenConjunction2 sephetho: 4194302 nako 77.0044ms

moeli o moholo: 8388608
maxEvenSephetho se arolang: 8388606 nako 109.0062ms
maxEvenDividing2 sephetho: 8388606 nako 78.0045ms
maxEvenConjunction sephetho: 8388606 nako 114.0065ms
maxEvenConjunction2 sephetho: 8388606 nako 78.0045ms

moeli o moholo: 16777216
maxEvenSephetho se arolang: 16777214 nako 109.0062ms
maxEvenDividing2 sephetho: 16777214 nako 77.0044ms
maxEvenConjunction sephetho: 16777214 nako 109.0063ms
maxEvenConjunction2 sephetho: 16777214 nako 77.0044ms

moeli o moholo: 33554432
maxEvenSephetho se arolang: 33554430 nako 113.0065ms
maxEvenDividing2 sephetho: 33554430 nako 78.0045ms
maxEvenConjunction sephetho: 33554430 nako 110.0063ms
maxEvenConjunction2 sephetho: 33554430 nako 80.0045ms

moeli o moholo: 67108864
maxEvenSephetho se arolang: 67108860 nako 112.0064ms
maxEvenDividing2 sephetho: 67108860 nako 77.0044ms
maxEvenConjunction sephetho: 67108860 nako 112.0064ms
maxEvenConjunction2 sephetho: 67108860 nako 80.0046ms

moeli o moholo: 134217728
maxEvenSephetho se arolang: 134217726 nako 109.0063ms
maxEvenDividing2 sephetho: 134217726 nako 78.0044ms
maxEvenConjunction sephetho: 134217726 nako 114.0065ms
maxEvenConjunction2 sephetho: 134217726 nako 81.0047ms

moeli o moholo: 268435456
maxEvenSephetho se arolang: 268435446 nako 111.0064ms
maxEvenDividing2 sephetho: 268435446 nako 79.0045ms
maxEvenConjunction sephetho: 268435446 nako 114.0065ms
maxEvenConjunction2 sephetho: 268435446 nako 79.0045ms

moeli o moholo: 536870912
maxEvenSephetho se arolang: 536870910 nako 107.0062ms
maxEvenDividing2 sephetho: 536870910 nako 76.0043ms
maxEvenConjunction sephetho: 536870910 nako 109.0062ms
maxEvenConjunction2 sephetho: 536870910 nako 80.0046ms

Ha kea fumana tlhaloso e hlakileng ea hore na ke hobane'ng ha Go compiler e sa ntlafatse khoutu 'me e lula e hlahloba boemo ba bobeli, le haeba ea pele e le leshano. Kapa mohlomong mahlo a ka a lerootho feela ’me ha ke bone phoso leha e le efe e totobetseng? Kapa na u hloka ho fana ka litaelo tse khethehileng ho moqapi? Nka thabela litlhaloso tse utloahalang.

PES: E, bakeng sa monate feela, ke ile ka etsa liteko tse tšoanang ho Java 5 le Java 7/8 - ntho e 'ngoe le e' ngoe e hlakile, nako ea ho bolaoa e tšoana.

Source: www.habr.com

Eketsa ka tlhaloso