Coinníollacha i Go agus a n-aisteach

An gceapann tú go bhfuil an dá rogha seo maidir le coinníollacha tástála taobh istigh de lúb comhionann i bhfeidhmíocht?

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


Thosaigh sé ar fad le “teocht inchinne”; bhí orm sampla a thabhairt den chuardach optamach don uimhir chothrom is mó i sraith slánuimhreacha [-x....x]. Bhí mé ag smaoineamh cé chomh maith is a bheadh ​​feidhmíocht níos fearr dá mbainfinn úsáid as iolrú loighciúil faoi 1 chun a dhéanamh amach an bhfuil uimhir cothrom nó nach bhfuil.


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

Níl mo thaithí cláir i Go an-fhairsing, díreach os cionn bliain go leith, úsáid mé é, cé go minic, ach amháin chun críocha utilitarian (bhuel, b'fhéidir ach amháin i gcás tionscadal amháin a bhaineann le seirbhís http ard-ualach), mar sin mé thosaigh leis. Oscail GoLand agus scríobh triail shimplí


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
}

Faighimid toradh a thaispeánann dá airde an tairseach, is minic a bhíonn athruithe feidhmíochta le feiceáil.

Déan comparáid idirmax 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

Tá sé soiléir, sa chás seo, le haghaidh tairseacha éagsúla tá tacair éagsúla de shonraí tástála againn, go n-athraíonn ualach an phróiseálaí (ar mo ríomhaire glúine i5-2540M) thart ar 20..30%, is é an chuimhne atá á áitiú ag an bhfeidhmchlár a ritheann ó GoLand ar an meán. thart ar 813MB - tá tionchar aige seo freisin ar iontaofacht an toraidh, ní mór duit cásanna tástála a shábháil ar dhiosca agus na tástálacha go léir a reáchtáil do gach tairseach ina n-aonar óna chéile.

Agus anois, ag smaoineamh ar conas é seo go léir a chur i bhfeidhm le costais íosta, ceartaíonn mé an seiceáil riocht go huathoibríoch

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

ar

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

Ritheann mé na trialacha arís... agus stopaim ag tuiscint rud ar bith :)

Tosaíonn an t-am a chaitear ar fhorghníomhú a bheith difriúil a thuilleadh de réir céatadáin/codáin faoin gcéad, ach faoi 10..15%. Cuirim 2 thástáil eile leis go tapa:

		
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
}

Ritheann mé é agus faighim an pictiúr seo:cumas eagar tosaigh: 100000000

tairseach uasta: 128
maxEvenDeviding result: 126 ré 116.0066ms
maxEvenDividing2 toradh: 126 ré 79.0045ms
maxEvenConjunction toradh: 126 ré 114.0065ms
maxEvenConjunction2 toradh: 126 ré 83.0048ms

tairseach uasta: 256
maxEvenDeviding result: 254 ré 111.0063ms
maxEvenDividing2 toradh: 254 ré 77.0044ms
maxEvenConjunction toradh: 254 ré 110.0063ms
maxEvenConjunction2 toradh: 254 ré 80.0046ms

tairseach uasta: 512
maxEvenDeviding result: 510 ré 114.0066ms
maxEvenDividing2 toradh: 510 ré 80.0045ms
maxEvenConjunction toradh: 510 ré 110.0063ms
maxEvenConjunction2 toradh: 510 ré 80.0046ms

tairseach uasta: 1024
maxEvenDeviding result: 1022 ré 109.0063ms
maxEvenDividing2 toradh: 1022 ré 77.0044ms
maxEvenConjunction toradh: 1022 ré 111.0063ms
maxEvenConjunction2 toradh: 1022 ré 81.0047ms

tairseach uasta: 2048
maxEvenDeviding result: 2046 ré 114.0065ms
maxEvenDividing2 toradh: 2046 ré 79.0045ms
maxEvenConjunction toradh: 2046 ré 113.0065ms
maxEvenConjunction2 toradh: 2046 ré 81.0046ms

tairseach uasta: 4096
maxEvenDeviding result: 4094 ré 114.0065ms
maxEvenDividing2 toradh: 4094 ré 80.0046ms
maxEvenConjunction toradh: 4094 ré 111.0063ms
maxEvenConjunction2 toradh: 4094 ré 78.0045ms

tairseach uasta: 8192
maxEvenDeviding result: 8190 ré 107.0062ms
maxEvenDividing2 toradh: 8190 ré 77.0044ms
maxEvenConjunction toradh: 8190 ré 111.0063ms
maxEvenConjunction2 toradh: 8190 ré 77.0044ms

tairseach uasta: 16384
maxEvenDeviding result: 16382 ré 109.0063ms
maxEvenDividing2 toradh: 16382 ré 77.0044ms
maxEvenConjunction toradh: 16382 ré 108.0062ms
maxEvenConjunction2 toradh: 16382 ré 77.0044ms

tairseach uasta: 32768
maxEvenDeviding result: 32766 ré 112.0064ms
maxEvenDividing2 toradh: 32766 ré 77.0044ms
maxEvenConjunction toradh: 32766 ré 109.0062ms
maxEvenConjunction2 toradh: 32766 ré 78.0045ms

tairseach uasta: 65536
maxEvenDeviding result: 65534 ré 109.0062ms
maxEvenDividing2 toradh: 65534 ré 75.0043ms
maxEvenConjunction toradh: 65534 ré 109.0063ms
maxEvenConjunction2 toradh: 65534 ré 79.0045ms

tairseach uasta: 131072
maxEvenDeviding result: 131070 ré 108.0061ms
maxEvenDividing2 toradh: 131070 ré 76.0044ms
maxEvenConjunction toradh: 131070 ré 110.0063ms
maxEvenConjunction2 toradh: 131070 ré 80.0046ms

tairseach uasta: 262144
maxEvenDeviding result: 262142 ré 110.0063ms
maxEvenDividing2 toradh: 262142 ré 76.0044ms
maxEvenConjunction toradh: 262142 ré 107.0061ms
maxEvenConjunction2 toradh: 262142 ré 78.0044ms

tairseach uasta: 524288
maxEvenDeviding result: 524286 ré 109.0062ms
maxEvenDividing2 toradh: 524286 ré 78.0045ms
maxEvenConjunction toradh: 524286 ré 109.0062ms
maxEvenConjunction2 toradh: 524286 ré 80.0046ms

tairseach uasta: 1048576
maxEvenDeviding result: 1048574 ré 109.0063ms
maxEvenDividing2 toradh: 1048574 ré 80.0045ms
maxEvenConjunction toradh: 1048574 ré 114.0066ms
maxEvenConjunction2 toradh: 1048574 ré 78.0044ms

tairseach uasta: 2097152
maxEvenDeviding result: 2097150 ré 111.0064ms
maxEvenDividing2 toradh: 2097150 ré 79.0045ms
maxEvenConjunction toradh: 2097150 ré 112.0064ms
maxEvenConjunction2 toradh: 2097150 ré 77.0044ms

tairseach uasta: 4194304
maxEvenDeviding result: 4194302 ré 111.0063ms
maxEvenDividing2 toradh: 4194302 ré 78.0045ms
maxEvenConjunction toradh: 4194302 ré 111.0063ms
maxEvenConjunction2 toradh: 4194302 ré 77.0044ms

tairseach uasta: 8388608
maxEvenDeviding result: 8388606 ré 109.0062ms
maxEvenDividing2 toradh: 8388606 ré 78.0045ms
maxEvenConjunction toradh: 8388606 ré 114.0065ms
maxEvenConjunction2 toradh: 8388606 ré 78.0045ms

tairseach uasta: 16777216
maxEvenDeviding result: 16777214 ré 109.0062ms
maxEvenDividing2 toradh: 16777214 ré 77.0044ms
maxEvenConjunction toradh: 16777214 ré 109.0063ms
maxEvenConjunction2 toradh: 16777214 ré 77.0044ms

tairseach uasta: 33554432
maxEvenDeviding result: 33554430 ré 113.0065ms
maxEvenDividing2 toradh: 33554430 ré 78.0045ms
maxEvenConjunction toradh: 33554430 ré 110.0063ms
maxEvenConjunction2 toradh: 33554430 ré 80.0045ms

tairseach uasta: 67108864
maxEvenDeviding result: 67108860 ré 112.0064ms
maxEvenDividing2 toradh: 67108860 ré 77.0044ms
maxEvenConjunction toradh: 67108860 ré 112.0064ms
maxEvenConjunction2 toradh: 67108860 ré 80.0046ms

tairseach uasta: 134217728
maxEvenDeviding result: 134217726 ré 109.0063ms
maxEvenDividing2 toradh: 134217726 ré 78.0044ms
maxEvenConjunction toradh: 134217726 ré 114.0065ms
maxEvenConjunction2 toradh: 134217726 ré 81.0047ms

tairseach uasta: 268435456
maxEvenDeviding result: 268435446 ré 111.0064ms
maxEvenDividing2 toradh: 268435446 ré 79.0045ms
maxEvenConjunction toradh: 268435446 ré 114.0065ms
maxEvenConjunction2 toradh: 268435446 ré 79.0045ms

tairseach uasta: 536870912
maxEvenDeviding result: 536870910 ré 107.0062ms
maxEvenDividing2 toradh: 536870910 ré 76.0043ms
maxEvenConjunction toradh: 536870910 ré 109.0062ms
maxEvenConjunction2 toradh: 536870910 ré 80.0046ms

Níorbh fhéidir liom míniú soiléir a fháil ar cén fáth nach ndéanann an tiomsaitheoir Go an cód a bharrfheabhsú agus seiceálann sé an dara coinníoll i gcónaí, fiú má tá an chéad cheann bréagach. Nó b’fhéidir nach bhfuil mo shúile ach doiléir agus ní fheicim aon bhotún soiléir? Nó an gá duit roinnt treoracha speisialta a sholáthar don tiomsaitheoir? Bheadh ​​áthas orm tuairimí ciallmhara a fháil.

PS: Sea, ach le haghaidh spraoi, rith mé tástálacha den chineál céanna ar Java 5 agus Java 7/8 - tá gach rud soiléir, tá an t-am forghníomhaithe mar an gcéanna.

Foinse: will.com

Add a comment