Cùmhnantan ann an Go agus an cuibhrigean

A bheil thu a’ smaoineachadh gu bheil an dà roghainn seo airson suidheachaidhean deuchainn taobh a-staigh lùb co-ionann ann an coileanadh?

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


Thòisich e uile le “blàthachadh na h-eanchainn”; B’ fheudar dhomh eisimpleir a thoirt seachad de sgrùdadh as fheàrr airson an àireamh eadhon as motha ann an sreath de shlànaichean [-x....x]. Bha mi a’ faighneachd dè cho math ‘s a bhiodh coileanadh nan cleachdadh mi iomadachadh loidsigeach le 1 gus faighinn a-mach a bheil àireamh eadhon no nach eil.


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

Chan eil an t-eòlas prògramadh agam ann an Go gu math farsaing, beagan a bharrachd air bliadhna gu leth, chleachd mi e, ged a bha e tric, ach dìreach airson adhbharan cleachdaidh (uill, is dòcha ach a-mhàin aon phròiseact co-cheangailte ri seirbheis http àrd-luchd), agus mar sin tha mi thòisich e leis. Fosgail GoLand agus sgrìobh deuchainn shìmplidh


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
}

Gheibh sinn toradh a sheallas mar as àirde an stairsneach, is ann as trice a bhios atharrachaidhean ann an coileanadh a’ nochdadh.

Dèan coimeasmax 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

Tha e soilleir, anns a’ chùis seo, airson diofar stairsnich gu bheil seataichean eadar-dhealaichte de dhàta deuchainn againn, gu bheil an luchd pròiseasar (air an laptop i5-2540M agam) ag atharrachadh timcheall air 20..30%, gu cuibheasach tha an cuimhne a tha an aplacaid a ’ruith bho GoLand a’ cleachdadh. timcheall air 813MB - tha seo cuideachd a ’toirt buaidh air earbsachd an toraidh, feumaidh tu cùisean deuchainn a shàbhaladh air diosc agus a h-uile deuchainn a ruith airson gach stairsneach leotha fhèin bho chèile.

Agus a-nis, a 'smaoineachadh air mar a chuireas tu seo an gnìomh le glè bheag de chosgaisean, bidh mi a' ceartachadh an t-suidheachaidh gu fèin-obrachail

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

air

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

Bidh mi a’ ruith nan deuchainnean a-rithist… agus stadaidh mi a’ tuigsinn rud sam bith :)

Chan eil an ùine a thathar a’ cur seachad air cur gu bàs a’ tòiseachadh a’ dol eadar-dhealaichte tuilleadh a rèir ceudadan/bloighean de cheud, ach le 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
}

Bidh mi ga ruith agus a’ faighinn an dealbh seo:comas sreath tùsail: 100000000

An ìre as àirde: 128
maxEvenDeviding toradh: 126 fad 116.0066ms
toradh maxEvenDividing2: 126 fad 79.0045ms
maxEvenConjunction toradh: 126 fad 114.0065ms
maxEvenConjunction2 toradh: 126 fad 83.0048ms

An ìre as àirde: 256
maxEvenDeviding toradh: 254 fad 111.0063ms
toradh maxEvenDividing2: 254 fad 77.0044ms
maxEvenConjunction toradh: 254 fad 110.0063ms
maxEvenConjunction2 toradh: 254 fad 80.0046ms

An ìre as àirde: 512
maxEvenDeviding toradh: 510 fad 114.0066ms
toradh maxEvenDividing2: 510 fad 80.0045ms
maxEvenConjunction toradh: 510 fad 110.0063ms
maxEvenConjunction2 toradh: 510 fad 80.0046ms

An ìre as àirde: 1024
maxEvenDeviding toradh: 1022 fad 109.0063ms
toradh maxEvenDividing2: 1022 fad 77.0044ms
maxEvenConjunction toradh: 1022 fad 111.0063ms
maxEvenConjunction2 toradh: 1022 fad 81.0047ms

An ìre as àirde: 2048
maxEvenDeviding toradh: 2046 fad 114.0065ms
toradh maxEvenDividing2: 2046 fad 79.0045ms
maxEvenConjunction toradh: 2046 fad 113.0065ms
maxEvenConjunction2 toradh: 2046 fad 81.0046ms

An ìre as àirde: 4096
maxEvenDeviding toradh: 4094 fad 114.0065ms
toradh maxEvenDividing2: 4094 fad 80.0046ms
maxEvenConjunction toradh: 4094 fad 111.0063ms
maxEvenConjunction2 toradh: 4094 fad 78.0045ms

An ìre as àirde: 8192
maxEvenDeviding toradh: 8190 fad 107.0062ms
toradh maxEvenDividing2: 8190 fad 77.0044ms
maxEvenConjunction toradh: 8190 fad 111.0063ms
maxEvenConjunction2 toradh: 8190 fad 77.0044ms

An ìre as àirde: 16384
maxEvenDeviding toradh: 16382 fad 109.0063ms
toradh maxEvenDividing2: 16382 fad 77.0044ms
maxEvenConjunction toradh: 16382 fad 108.0062ms
maxEvenConjunction2 toradh: 16382 fad 77.0044ms

An ìre as àirde: 32768
maxEvenDeviding toradh: 32766 fad 112.0064ms
toradh maxEvenDividing2: 32766 fad 77.0044ms
maxEvenConjunction toradh: 32766 fad 109.0062ms
maxEvenConjunction2 toradh: 32766 fad 78.0045ms

An ìre as àirde: 65536
maxEvenDeviding toradh: 65534 fad 109.0062ms
toradh maxEvenDividing2: 65534 fad 75.0043ms
maxEvenConjunction toradh: 65534 fad 109.0063ms
maxEvenConjunction2 toradh: 65534 fad 79.0045ms

An ìre as àirde: 131072
maxEvenDeviding toradh: 131070 fad 108.0061ms
toradh maxEvenDividing2: 131070 fad 76.0044ms
maxEvenConjunction toradh: 131070 fad 110.0063ms
maxEvenConjunction2 toradh: 131070 fad 80.0046ms

An ìre as àirde: 262144
maxEvenDeviding toradh: 262142 fad 110.0063ms
toradh maxEvenDividing2: 262142 fad 76.0044ms
maxEvenConjunction toradh: 262142 fad 107.0061ms
maxEvenConjunction2 toradh: 262142 fad 78.0044ms

An ìre as àirde: 524288
maxEvenDeviding toradh: 524286 fad 109.0062ms
toradh maxEvenDividing2: 524286 fad 78.0045ms
maxEvenConjunction toradh: 524286 fad 109.0062ms
maxEvenConjunction2 toradh: 524286 fad 80.0046ms

An ìre as àirde: 1048576
maxEvenDeviding toradh: 1048574 fad 109.0063ms
toradh maxEvenDividing2: 1048574 fad 80.0045ms
maxEvenConjunction toradh: 1048574 fad 114.0066ms
maxEvenConjunction2 toradh: 1048574 fad 78.0044ms

An ìre as àirde: 2097152
maxEvenDeviding toradh: 2097150 fad 111.0064ms
toradh maxEvenDividing2: 2097150 fad 79.0045ms
maxEvenConjunction toradh: 2097150 fad 112.0064ms
maxEvenConjunction2 toradh: 2097150 fad 77.0044ms

An ìre as àirde: 4194304
maxEvenDeviding toradh: 4194302 fad 111.0063ms
toradh maxEvenDividing2: 4194302 fad 78.0045ms
maxEvenConjunction toradh: 4194302 fad 111.0063ms
maxEvenConjunction2 toradh: 4194302 fad 77.0044ms

An ìre as àirde: 8388608
maxEvenDeviding toradh: 8388606 fad 109.0062ms
toradh maxEvenDividing2: 8388606 fad 78.0045ms
maxEvenConjunction toradh: 8388606 fad 114.0065ms
maxEvenConjunction2 toradh: 8388606 fad 78.0045ms

An ìre as àirde: 16777216
maxEvenDeviding toradh: 16777214 fad 109.0062ms
toradh maxEvenDividing2: 16777214 fad 77.0044ms
maxEvenConjunction toradh: 16777214 fad 109.0063ms
maxEvenConjunction2 toradh: 16777214 fad 77.0044ms

An ìre as àirde: 33554432
maxEvenDeviding toradh: 33554430 fad 113.0065ms
toradh maxEvenDividing2: 33554430 fad 78.0045ms
maxEvenConjunction toradh: 33554430 fad 110.0063ms
maxEvenConjunction2 toradh: 33554430 fad 80.0045ms

An ìre as àirde: 67108864
maxEvenDeviding toradh: 67108860 fad 112.0064ms
toradh maxEvenDividing2: 67108860 fad 77.0044ms
maxEvenConjunction toradh: 67108860 fad 112.0064ms
maxEvenConjunction2 toradh: 67108860 fad 80.0046ms

An ìre as àirde: 134217728
maxEvenDeviding toradh: 134217726 fad 109.0063ms
toradh maxEvenDividing2: 134217726 fad 78.0044ms
maxEvenConjunction toradh: 134217726 fad 114.0065ms
maxEvenConjunction2 toradh: 134217726 fad 81.0047ms

An ìre as àirde: 268435456
maxEvenDeviding toradh: 268435446 fad 111.0064ms
toradh maxEvenDividing2: 268435446 fad 79.0045ms
maxEvenConjunction toradh: 268435446 fad 114.0065ms
maxEvenConjunction2 toradh: 268435446 fad 79.0045ms

An ìre as àirde: 536870912
maxEvenDeviding toradh: 536870910 fad 107.0062ms
toradh maxEvenDividing2: 536870910 fad 76.0043ms
maxEvenConjunction toradh: 536870910 fad 109.0062ms
maxEvenConjunction2 toradh: 536870910 fad 80.0046ms

Cha b’ urrainn dhomh mìneachadh soilleir a lorg carson nach dèan an compiler Go an còd as fheàrr agus bidh e an-còmhnaidh a ’sgrùdadh an dàrna suidheachadh, eadhon ged a tha a’ chiad fhear meallta. No is dòcha gu bheil mo shùilean dìreach doilleir agus nach eil mi a’ faicinn mearachd follaiseach? No am feum thu stiùireadh sònraichte a thoirt don neach-cruinneachaidh? Bhithinn toilichte airson beachdan ciallach.

PS: Tha, dìreach airson spòrs, ruith mi deuchainnean coltach ris air Java 5 agus Java 7/8 - tha a h-uile dad soilleir, tha an ùine cur gu bàs mar an ceudna.

Source: www.habr.com

Cuir beachd ann