Awọn ipo ni Go ati awọn quirks wọn

Ṣe o ro pe awọn aṣayan meji wọnyi fun awọn ipo idanwo inu lupu jẹ deede ni iṣẹ bi?

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


Gbogbo rẹ bẹrẹ pẹlu “gbigbona ọpọlọ”; Mo ni lati fun apẹẹrẹ wiwa ti o dara julọ fun nọmba ani ti o tobi julọ ni titobi awọn odidi [-x....x]. Mo n ṣe iyalẹnu bawo ni iṣẹ ṣiṣe ti o dara julọ yoo jẹ ti MO ba lo isodipupo ọgbọn nipasẹ 1 lati rii boya nọmba kan paapaa tabi rara.


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

Iriri siseto mi ni Go ko lọpọlọpọ, o kan ju ọdun kan ati idaji, Mo lo, botilẹjẹpe igbagbogbo, ṣugbọn fun awọn idi iwulo (daradara, boya ayafi fun iṣẹ akanṣe kan ti o ni ibatan si iṣẹ http ti o ga julọ), nitorinaa MO bẹrẹ pẹlu rẹ. Ṣii GoLand ki o kọ idanwo ti o rọrun


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
}

A gba abajade ti o fihan pe awọn ti o ga ni ala, awọn diẹ igba sokesile ni išẹ han.

Afiweramax 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

O han gbangba pe ninu ọran yii, fun awọn iloro oriṣiriṣi a ni awọn eto data idanwo oriṣiriṣi, fifuye ero isise (lori kọnputa i5-2540M mi) yatọ ni ayika 20..30%, iranti ti o wa nipasẹ ohun elo ti n ṣiṣẹ lati GoLand wa ni apapọ. nipa 813MB - eyi tun ni ipa lori igbẹkẹle ti abajade, o nilo lati fipamọ awọn ọran idanwo lori disiki ati ṣiṣe gbogbo awọn idanwo fun iloro kọọkan ni ipinya lati ara wọn.

Ati ni bayi, ni ironu nipa bii o ṣe le ṣe gbogbo eyi pẹlu awọn idiyele kekere, Mo ṣe atunṣe ayẹwo ipo laifọwọyi

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

on

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

Mo tun ṣe awọn idanwo naa… ati pe Mo da agbọye ohunkohun duro :)

Akoko ti a lo lori ipaniyan bẹrẹ lati yato ko si nipasẹ awọn ipin/awọn ida kan ninu ogorun, ṣugbọn nipasẹ 10..15% Mo yara ṣafikun awọn idanwo 2 diẹ sii:

		
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
}

Mo ṣiṣẹ ati gba aworan yii:agbara orun akọkọ: 100000000

ti o pọju: 128
maxEvenDividing esi: 126 iye 116.0066ms
maxEvenDividing2 esi: 126 iye 79.0045ms
maxEvenConjunction esi: 126 iye 114.0065ms
maxEvenConjunction2 esi: 126 iye 83.0048ms

ti o pọju: 256
maxEvenDividing esi: 254 iye 111.0063ms
maxEvenDividing2 esi: 254 iye 77.0044ms
maxEvenConjunction esi: 254 iye 110.0063ms
maxEvenConjunction2 esi: 254 iye 80.0046ms

ti o pọju: 512
maxEvenDividing esi: 510 iye 114.0066ms
maxEvenDividing2 esi: 510 iye 80.0045ms
maxEvenConjunction esi: 510 iye 110.0063ms
maxEvenConjunction2 esi: 510 iye 80.0046ms

ti o pọju: 1024
maxEvenDividing esi: 1022 iye 109.0063ms
maxEvenDividing2 esi: 1022 iye 77.0044ms
maxEvenConjunction esi: 1022 iye 111.0063ms
maxEvenConjunction2 esi: 1022 iye 81.0047ms

ti o pọju: 2048
maxEvenDividing esi: 2046 iye 114.0065ms
maxEvenDividing2 esi: 2046 iye 79.0045ms
maxEvenConjunction esi: 2046 iye 113.0065ms
maxEvenConjunction2 esi: 2046 iye 81.0046ms

ti o pọju: 4096
maxEvenDividing esi: 4094 iye 114.0065ms
maxEvenDividing2 esi: 4094 iye 80.0046ms
maxEvenConjunction esi: 4094 iye 111.0063ms
maxEvenConjunction2 esi: 4094 iye 78.0045ms

ti o pọju: 8192
maxEvenDividing esi: 8190 iye 107.0062ms
maxEvenDividing2 esi: 8190 iye 77.0044ms
maxEvenConjunction esi: 8190 iye 111.0063ms
maxEvenConjunction2 esi: 8190 iye 77.0044ms

ti o pọju: 16384
maxEvenDividing esi: 16382 iye 109.0063ms
maxEvenDividing2 esi: 16382 iye 77.0044ms
maxEvenConjunction esi: 16382 iye 108.0062ms
maxEvenConjunction2 esi: 16382 iye 77.0044ms

ti o pọju: 32768
maxEvenDividing esi: 32766 iye 112.0064ms
maxEvenDividing2 esi: 32766 iye 77.0044ms
maxEvenConjunction esi: 32766 iye 109.0062ms
maxEvenConjunction2 esi: 32766 iye 78.0045ms

ti o pọju: 65536
maxEvenDividing esi: 65534 iye 109.0062ms
maxEvenDividing2 esi: 65534 iye 75.0043ms
maxEvenConjunction esi: 65534 iye 109.0063ms
maxEvenConjunction2 esi: 65534 iye 79.0045ms

ti o pọju: 131072
maxEvenDividing esi: 131070 iye 108.0061ms
maxEvenDividing2 esi: 131070 iye 76.0044ms
maxEvenConjunction esi: 131070 iye 110.0063ms
maxEvenConjunction2 esi: 131070 iye 80.0046ms

ti o pọju: 262144
maxEvenDividing esi: 262142 iye 110.0063ms
maxEvenDividing2 esi: 262142 iye 76.0044ms
maxEvenConjunction esi: 262142 iye 107.0061ms
maxEvenConjunction2 esi: 262142 iye 78.0044ms

ti o pọju: 524288
maxEvenDividing esi: 524286 iye 109.0062ms
maxEvenDividing2 esi: 524286 iye 78.0045ms
maxEvenConjunction esi: 524286 iye 109.0062ms
maxEvenConjunction2 esi: 524286 iye 80.0046ms

ti o pọju: 1048576
maxEvenDividing esi: 1048574 iye 109.0063ms
maxEvenDividing2 esi: 1048574 iye 80.0045ms
maxEvenConjunction esi: 1048574 iye 114.0066ms
maxEvenConjunction2 esi: 1048574 iye 78.0044ms

ti o pọju: 2097152
maxEvenDividing esi: 2097150 iye 111.0064ms
maxEvenDividing2 esi: 2097150 iye 79.0045ms
maxEvenConjunction esi: 2097150 iye 112.0064ms
maxEvenConjunction2 esi: 2097150 iye 77.0044ms

ti o pọju: 4194304
maxEvenDividing esi: 4194302 iye 111.0063ms
maxEvenDividing2 esi: 4194302 iye 78.0045ms
maxEvenConjunction esi: 4194302 iye 111.0063ms
maxEvenConjunction2 esi: 4194302 iye 77.0044ms

ti o pọju: 8388608
maxEvenDividing esi: 8388606 iye 109.0062ms
maxEvenDividing2 esi: 8388606 iye 78.0045ms
maxEvenConjunction esi: 8388606 iye 114.0065ms
maxEvenConjunction2 esi: 8388606 iye 78.0045ms

ti o pọju: 16777216
maxEvenDividing esi: 16777214 iye 109.0062ms
maxEvenDividing2 esi: 16777214 iye 77.0044ms
maxEvenConjunction esi: 16777214 iye 109.0063ms
maxEvenConjunction2 esi: 16777214 iye 77.0044ms

ti o pọju: 33554432
maxEvenDividing esi: 33554430 iye 113.0065ms
maxEvenDividing2 esi: 33554430 iye 78.0045ms
maxEvenConjunction esi: 33554430 iye 110.0063ms
maxEvenConjunction2 esi: 33554430 iye 80.0045ms

ti o pọju: 67108864
maxEvenDividing esi: 67108860 iye 112.0064ms
maxEvenDividing2 esi: 67108860 iye 77.0044ms
maxEvenConjunction esi: 67108860 iye 112.0064ms
maxEvenConjunction2 esi: 67108860 iye 80.0046ms

ti o pọju: 134217728
maxEvenDividing esi: 134217726 iye 109.0063ms
maxEvenDividing2 esi: 134217726 iye 78.0044ms
maxEvenConjunction esi: 134217726 iye 114.0065ms
maxEvenConjunction2 esi: 134217726 iye 81.0047ms

ti o pọju: 268435456
maxEvenDividing esi: 268435446 iye 111.0064ms
maxEvenDividing2 esi: 268435446 iye 79.0045ms
maxEvenConjunction esi: 268435446 iye 114.0065ms
maxEvenConjunction2 esi: 268435446 iye 79.0045ms

ti o pọju: 536870912
maxEvenDividing esi: 536870910 iye 107.0062ms
maxEvenDividing2 esi: 536870910 iye 76.0043ms
maxEvenConjunction esi: 536870910 iye 109.0062ms
maxEvenConjunction2 esi: 536870910 iye 80.0046ms

Emi ko le rii alaye ti o daju idi ti Go alakojo ko ṣe iṣapeye koodu naa ati nigbagbogbo ṣayẹwo ipo keji, paapaa ti akọkọ jẹ eke. Tabi boya oju mi ​​kan blurry ati pe Emi ko rii eyikeyi aṣiṣe ti o han? Tabi ṣe o nilo lati pese diẹ ninu awọn ilana pataki si alakojọ? Emi yoo dun fun awọn asọye oye.

PS: Bẹẹni, o kan fun igbadun, Mo sare awọn idanwo kanna lori Java 5 ati Java 7/8 - ohun gbogbo jẹ kedere, akoko ipaniyan jẹ kanna.

orisun: www.habr.com

Fi ọrọìwòye kun