Sharuɗɗa a cikin Go da abubuwan da suka dace

Kuna tsammanin waɗannan zaɓuɓɓuka biyu don yanayin gwaji a cikin madauki daidai suke a cikin aiki?

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


Duk abin ya fara ne da “dumin kwakwalwa”; Dole ne in ba da misali na mafi kyawun bincike don mafi girma ko lamba a cikin jeri na lamba [-x....x]. Ina mamakin yadda mafi kyawun aiki zai kasance idan na yi amfani da haɓakar ma'ana ta 1 don gano ko lamba ta kasance ko a'a.


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

Kwarewar shirye-shiryena a cikin Go ba ta da yawa sosai, dan sama da shekara guda da rabi, na yi amfani da shi, kodayake sau da yawa, amma don dalilai na amfani kawai (da kyau, watakila banda wani aiki ɗaya da ke da alaƙa da sabis na http mai ɗaukar nauyi), don haka Na fara da shi. Bude GoLand kuma rubuta gwaji mai sauƙi


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
}

Muna samun sakamako wanda ke nuna cewa mafi girman ƙofa, mafi sau da yawa canje-canje a cikin aikin yana bayyana.

Kwatantamax 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

A bayyane yake cewa a cikin wannan yanayin, don ƙofofin daban-daban muna da nau'ikan bayanan gwaji daban-daban, nauyin sarrafawa (a kan kwamfutar tafi-da-gidanka na i5-2540M) ya bambanta kusan 20..30%, ƙwaƙwalwar ajiyar aikace-aikacen da ke gudana daga GoLand yana kan matsakaici. game da 813MB - wannan kuma yana shafar amincin sakamakon, kuna buƙatar adana lokuta na gwaji akan faifai kuma gudanar da duk gwaje-gwaje don kowane kofa a keɓe da juna.

Kuma yanzu, tunani game da yadda za a aiwatar da duk wannan tare da ƙananan farashi, na gyara yanayin duba ta atomatik

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

a kan

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

Na sake gudanar da gwaje-gwajen... kuma na daina fahimtar wani abu :)

Lokacin da aka kashe akan aiwatarwa ya fara bambanta ba ta kaso/kashi na kashi ɗaya ba, amma da kashi 10..15% cikin sauri na ƙara ƙarin gwaje-gwaje 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
}

Ina gudu kuma na sami wannan hoton:farkon tsararru iya aiki: 100000000

max matsakaici: 128
sakamakon maxEvenRarrabawa: 126 tsawon lokaci 116.0066ms
sakamakon maxEvenDividing2: 126 tsawon lokaci 79.0045ms
Sakamakon maxEvenConjunction: 126 tsawon lokaci 114.0065ms
sakamakon maxEvenConjunction2: 126 tsawon lokaci 83.0048ms

max matsakaici: 256
sakamakon maxEvenRarrabawa: 254 tsawon lokaci 111.0063ms
sakamakon maxEvenDividing2: 254 tsawon lokaci 77.0044ms
Sakamakon maxEvenConjunction: 254 tsawon lokaci 110.0063ms
sakamakon maxEvenConjunction2: 254 tsawon lokaci 80.0046ms

max matsakaici: 512
sakamakon maxEvenRarrabawa: 510 tsawon lokaci 114.0066ms
sakamakon maxEvenDividing2: 510 tsawon lokaci 80.0045ms
Sakamakon maxEvenConjunction: 510 tsawon lokaci 110.0063ms
sakamakon maxEvenConjunction2: 510 tsawon lokaci 80.0046ms

max matsakaici: 1024
sakamakon maxEvenRarrabawa: 1022 tsawon lokaci 109.0063ms
sakamakon maxEvenDividing2: 1022 tsawon lokaci 77.0044ms
Sakamakon maxEvenConjunction: 1022 tsawon lokaci 111.0063ms
sakamakon maxEvenConjunction2: 1022 tsawon lokaci 81.0047ms

max matsakaici: 2048
sakamakon maxEvenRarrabawa: 2046 tsawon lokaci 114.0065ms
sakamakon maxEvenDividing2: 2046 tsawon lokaci 79.0045ms
Sakamakon maxEvenConjunction: 2046 tsawon lokaci 113.0065ms
sakamakon maxEvenConjunction2: 2046 tsawon lokaci 81.0046ms

max matsakaici: 4096
sakamakon maxEvenRarrabawa: 4094 tsawon lokaci 114.0065ms
sakamakon maxEvenDividing2: 4094 tsawon lokaci 80.0046ms
Sakamakon maxEvenConjunction: 4094 tsawon lokaci 111.0063ms
sakamakon maxEvenConjunction2: 4094 tsawon lokaci 78.0045ms

max matsakaici: 8192
sakamakon maxEvenRarrabawa: 8190 tsawon lokaci 107.0062ms
sakamakon maxEvenDividing2: 8190 tsawon lokaci 77.0044ms
Sakamakon maxEvenConjunction: 8190 tsawon lokaci 111.0063ms
sakamakon maxEvenConjunction2: 8190 tsawon lokaci 77.0044ms

max matsakaici: 16384
sakamakon maxEvenRarrabawa: 16382 tsawon lokaci 109.0063ms
sakamakon maxEvenDividing2: 16382 tsawon lokaci 77.0044ms
Sakamakon maxEvenConjunction: 16382 tsawon lokaci 108.0062ms
sakamakon maxEvenConjunction2: 16382 tsawon lokaci 77.0044ms

max matsakaici: 32768
sakamakon maxEvenRarrabawa: 32766 tsawon lokaci 112.0064ms
sakamakon maxEvenDividing2: 32766 tsawon lokaci 77.0044ms
Sakamakon maxEvenConjunction: 32766 tsawon lokaci 109.0062ms
sakamakon maxEvenConjunction2: 32766 tsawon lokaci 78.0045ms

max matsakaici: 65536
sakamakon maxEvenRarrabawa: 65534 tsawon lokaci 109.0062ms
sakamakon maxEvenDividing2: 65534 tsawon lokaci 75.0043ms
Sakamakon maxEvenConjunction: 65534 tsawon lokaci 109.0063ms
sakamakon maxEvenConjunction2: 65534 tsawon lokaci 79.0045ms

max matsakaici: 131072
sakamakon maxEvenRarrabawa: 131070 tsawon lokaci 108.0061ms
sakamakon maxEvenDividing2: 131070 tsawon lokaci 76.0044ms
Sakamakon maxEvenConjunction: 131070 tsawon lokaci 110.0063ms
sakamakon maxEvenConjunction2: 131070 tsawon lokaci 80.0046ms

max matsakaici: 262144
sakamakon maxEvenRarrabawa: 262142 tsawon lokaci 110.0063ms
sakamakon maxEvenDividing2: 262142 tsawon lokaci 76.0044ms
Sakamakon maxEvenConjunction: 262142 tsawon lokaci 107.0061ms
sakamakon maxEvenConjunction2: 262142 tsawon lokaci 78.0044ms

max matsakaici: 524288
sakamakon maxEvenRarrabawa: 524286 tsawon lokaci 109.0062ms
sakamakon maxEvenDividing2: 524286 tsawon lokaci 78.0045ms
Sakamakon maxEvenConjunction: 524286 tsawon lokaci 109.0062ms
sakamakon maxEvenConjunction2: 524286 tsawon lokaci 80.0046ms

max matsakaici: 1048576
sakamakon maxEvenRarrabawa: 1048574 tsawon lokaci 109.0063ms
sakamakon maxEvenDividing2: 1048574 tsawon lokaci 80.0045ms
Sakamakon maxEvenConjunction: 1048574 tsawon lokaci 114.0066ms
sakamakon maxEvenConjunction2: 1048574 tsawon lokaci 78.0044ms

max matsakaici: 2097152
sakamakon maxEvenRarrabawa: 2097150 tsawon lokaci 111.0064ms
sakamakon maxEvenDividing2: 2097150 tsawon lokaci 79.0045ms
Sakamakon maxEvenConjunction: 2097150 tsawon lokaci 112.0064ms
sakamakon maxEvenConjunction2: 2097150 tsawon lokaci 77.0044ms

max matsakaici: 4194304
sakamakon maxEvenRarrabawa: 4194302 tsawon lokaci 111.0063ms
sakamakon maxEvenDividing2: 4194302 tsawon lokaci 78.0045ms
Sakamakon maxEvenConjunction: 4194302 tsawon lokaci 111.0063ms
sakamakon maxEvenConjunction2: 4194302 tsawon lokaci 77.0044ms

max matsakaici: 8388608
sakamakon maxEvenRarrabawa: 8388606 tsawon lokaci 109.0062ms
sakamakon maxEvenDividing2: 8388606 tsawon lokaci 78.0045ms
Sakamakon maxEvenConjunction: 8388606 tsawon lokaci 114.0065ms
sakamakon maxEvenConjunction2: 8388606 tsawon lokaci 78.0045ms

max matsakaici: 16777216
sakamakon maxEvenRarrabawa: 16777214 tsawon lokaci 109.0062ms
sakamakon maxEvenDividing2: 16777214 tsawon lokaci 77.0044ms
Sakamakon maxEvenConjunction: 16777214 tsawon lokaci 109.0063ms
sakamakon maxEvenConjunction2: 16777214 tsawon lokaci 77.0044ms

max matsakaici: 33554432
sakamakon maxEvenRarrabawa: 33554430 tsawon lokaci 113.0065ms
sakamakon maxEvenDividing2: 33554430 tsawon lokaci 78.0045ms
Sakamakon maxEvenConjunction: 33554430 tsawon lokaci 110.0063ms
sakamakon maxEvenConjunction2: 33554430 tsawon lokaci 80.0045ms

max matsakaici: 67108864
sakamakon maxEvenRarrabawa: 67108860 tsawon lokaci 112.0064ms
sakamakon maxEvenDividing2: 67108860 tsawon lokaci 77.0044ms
Sakamakon maxEvenConjunction: 67108860 tsawon lokaci 112.0064ms
sakamakon maxEvenConjunction2: 67108860 tsawon lokaci 80.0046ms

max matsakaici: 134217728
sakamakon maxEvenRarrabawa: 134217726 tsawon lokaci 109.0063ms
sakamakon maxEvenDividing2: 134217726 tsawon lokaci 78.0044ms
Sakamakon maxEvenConjunction: 134217726 tsawon lokaci 114.0065ms
sakamakon maxEvenConjunction2: 134217726 tsawon lokaci 81.0047ms

max matsakaici: 268435456
sakamakon maxEvenRarrabawa: 268435446 tsawon lokaci 111.0064ms
sakamakon maxEvenDividing2: 268435446 tsawon lokaci 79.0045ms
Sakamakon maxEvenConjunction: 268435446 tsawon lokaci 114.0065ms
sakamakon maxEvenConjunction2: 268435446 tsawon lokaci 79.0045ms

max matsakaici: 536870912
sakamakon maxEvenRarrabawa: 536870910 tsawon lokaci 107.0062ms
sakamakon maxEvenDividing2: 536870910 tsawon lokaci 76.0043ms
Sakamakon maxEvenConjunction: 536870910 tsawon lokaci 109.0062ms
sakamakon maxEvenConjunction2: 536870910 tsawon lokaci 80.0046ms

Ba zan iya samun cikakken bayani dalilin da yasa mai tarawa Go baya inganta lambar kuma koyaushe yana duba yanayin na biyu, koda na farko karya ne. Ko watakila idanuna sun bushe kuma ban ga wani kuskure a bayyane ba? Ko kuna buƙatar samar da wasu umarni na musamman ga mai tarawa? Zan yi farin ciki don sharhi masu ma'ana.

PS: Ee, kawai don jin daɗi, Na gudanar da gwaje-gwaje iri ɗaya akan Java 5 da Java 7/8 - komai a bayyane yake, lokacin aiwatarwa iri ɗaya ne.

source: www.habr.com

Add a comment