Go ရှိ အခြေအနေများနှင့် ၎င်းတို့၏ ထူးခြားချက်များ

စက်ဝိုင်းအတွင်း စမ်းသပ်မှုအခြေအနေများအတွက် ဤရွေးချယ်စရာနှစ်ခုသည် စွမ်းဆောင်ရည်နှင့် ညီမျှသည်ဟု သင်ထင်ပါသလား။

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


အားလုံးက "ဦးနှောက်နွေးထွေးမှု" နဲ့ စတင်ခဲ့တာပါ၊ ကိန်းပြည့် [-x....x] ရဲ့ array တစ်ခုထဲမှာ အကြီးဆုံးကိန်းဂဏန်းတွေအတွက် အကောင်းဆုံးရှာဖွေမှုတစ်ခု ဥပမာတစ်ခုပေးရပါမယ်။ ဂဏန်းတစ်လုံးသည် တစ်လုံးဟုတ်မဟုတ်ကို တွက်ဆရန် ယုတ္တိဗေဒကိန်းဂဏန်းဖြင့် 1 ဖြင့် မြှောက်ပါက စွမ်းဆောင်ရည်မည်မျှ ပိုကောင်းမည်ကို တွေးတောနေပါသည်။


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

Go တွင် ကျွန်ုပ်၏ ပရိုဂရမ်ရေးသားခြင်း အတွေ့အကြုံသည် အလွန်ကျယ်ပြန့်သည်မဟုတ်ပါ၊ တစ်နှစ်ခွဲကျော်သာရှိသော်လည်း၊ မကြာခဏသော်လည်း အကျိုးရှိစေရန်အတွက် သက်သက်အသုံးပြုခဲ့သည် (ကောင်းပြီ၊ ဝန်ပိုမြင့်သော http ဝန်ဆောင်မှုနှင့်ဆိုင်သော ပရောဂျက်တစ်ခုမှလွဲ၍ ဖြစ်နိုင်ပါသည်) ထို့ကြောင့် ကျွန်ုပ် အဲဒါနဲ့ စတင်ခဲ့တယ်။ GoLand ကိုဖွင့်ပြီး ရိုးရှင်းသော စမ်းသပ်မှုတစ်ခုကို ရေးပါ။


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
}

သတ်မှတ်နှုန်း မြင့်လေ၊ စွမ်းဆောင်ရည် အတက်အကျ များလေလေ ထွက်ပေါ်လာသည်ကို ပြသသော ရလဒ်တစ်ခု ရရှိပါသည်။

နှိုငျးယှဉျmax 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

ဤအခြေအနေတွင်၊ မတူညီသောအဆင့်များအတွက် ကျွန်ုပ်တို့တွင် မတူညီသောစမ်းသပ်ဒေတာအစုံရှိသည်၊ ပရိုဆက်ဆာဝန် (ကျွန်ုပ်၏ i5-2540M လက်ပ်တော့) တွင် 20..30% ဝန်းကျင်တွင် GoLand လည်ပတ်နေသည့် မမ်မိုရီသည် ပျမ်းမျှအားဖြင့် ကွာခြားသည် 813MB ခန့် - ၎င်းသည် ရလဒ်၏ယုံကြည်စိတ်ချရမှုကိုလည်း သက်ရောက်သည်၊ သင်သည် စမ်းသပ်မှုကိစ္စများကို disk တွင်သိမ်းဆည်းပြီး တစ်ခုနှင့်တစ်ခု သီးခြားခွဲထားသည့် အဆင့်တစ်ခုစီအတွက် စမ်းသပ်မှုအားလုံးကို လုပ်ဆောင်ရန် လိုအပ်သည်။

ယခုမူ၊ ဤအရာအားလုံးကို ကုန်ကျစရိတ်အနည်းဆုံးဖြင့် မည်သို့အကောင်အထည်ဖော်ရမည်ကို စဉ်းစားနေကာ အခြေအနေစစ်ဆေးခြင်းကို အလိုအလျောက်ပြင်ပေးပါသည်။

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

အပေါ်

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

စာမေးပွဲတွေပြန်ဖြေတော့... ဘာမှနားမလည်တော့ဘူး :)

ကွပ်မျက်မှုတွင်အသုံးပြုသည့်အချိန်သည် ရာခိုင်နှုန်းတစ်ခု၏ ရာခိုင်နှုန်း/အပိုင်းခွဲများဖြင့် ကွဲပြားတော့မည်မဟုတ်သော်လည်း 10..15% ဖြင့် ကျွန်ုပ်သည် နောက်ထပ်စမ်းသပ်မှု 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
}

ကျွန်တော် run ပြီး ဒီပုံကိုရလိုက်တယ်ကနဦး array စွမ်းရည်- 100000000

အမြင့်ဆုံးအဆင့်- ၁၂၈
maxEvenDividing ရလဒ်- 126 ကြာချိန် 116.0066ms
maxEvenDividing2 ရလဒ်- 126 ကြာချိန် 79.0045ms
maxEvenConjunction ရလဒ်- 126 ကြာချိန် 114.0065ms
maxEvenConjunction2 ရလဒ်- 126 ကြာချိန် 83.0048ms

အမြင့်ဆုံးအဆင့်- ၁၂၈
maxEvenDividing ရလဒ်- 254 ကြာချိန် 111.0063ms
maxEvenDividing2 ရလဒ်- 254 ကြာချိန် 77.0044ms
maxEvenConjunction ရလဒ်- 254 ကြာချိန် 110.0063ms
maxEvenConjunction2 ရလဒ်- 254 ကြာချိန် 80.0046ms

အမြင့်ဆုံးအဆင့်- ၁၂၈
maxEvenDividing ရလဒ်- 510 ကြာချိန် 114.0066ms
maxEvenDividing2 ရလဒ်- 510 ကြာချိန် 80.0045ms
maxEvenConjunction ရလဒ်- 510 ကြာချိန် 110.0063ms
maxEvenConjunction2 ရလဒ်- 510 ကြာချိန် 80.0046ms

အမြင့်ဆုံးအဆင့်- ၁၂၈
maxEvenDividing ရလဒ်- 1022 ကြာချိန် 109.0063ms
maxEvenDividing2 ရလဒ်- 1022 ကြာချိန် 77.0044ms
maxEvenConjunction ရလဒ်- 1022 ကြာချိန် 111.0063ms
maxEvenConjunction2 ရလဒ်- 1022 ကြာချိန် 81.0047ms

အမြင့်ဆုံးအဆင့်- ၁၂၈
maxEvenDividing ရလဒ်- 2046 ကြာချိန် 114.0065ms
maxEvenDividing2 ရလဒ်- 2046 ကြာချိန် 79.0045ms
maxEvenConjunction ရလဒ်- 2046 ကြာချိန် 113.0065ms
maxEvenConjunction2 ရလဒ်- 2046 ကြာချိန် 81.0046ms

အမြင့်ဆုံးအဆင့်- ၁၂၈
maxEvenDividing ရလဒ်- 4094 ကြာချိန် 114.0065ms
maxEvenDividing2 ရလဒ်- 4094 ကြာချိန် 80.0046ms
maxEvenConjunction ရလဒ်- 4094 ကြာချိန် 111.0063ms
maxEvenConjunction2 ရလဒ်- 4094 ကြာချိန် 78.0045ms

အမြင့်ဆုံးအဆင့်- ၁၂၈
maxEvenDividing ရလဒ်- 8190 ကြာချိန် 107.0062ms
maxEvenDividing2 ရလဒ်- 8190 ကြာချိန် 77.0044ms
maxEvenConjunction ရလဒ်- 8190 ကြာချိန် 111.0063ms
maxEvenConjunction2 ရလဒ်- 8190 ကြာချိန် 77.0044ms

အမြင့်ဆုံးအဆင့်- ၁၂၈
maxEvenDividing ရလဒ်- 16382 ကြာချိန် 109.0063ms
maxEvenDividing2 ရလဒ်- 16382 ကြာချိန် 77.0044ms
maxEvenConjunction ရလဒ်- 16382 ကြာချိန် 108.0062ms
maxEvenConjunction2 ရလဒ်- 16382 ကြာချိန် 77.0044ms

အမြင့်ဆုံးအဆင့်- ၁၂၈
maxEvenDividing ရလဒ်- 32766 ကြာချိန် 112.0064ms
maxEvenDividing2 ရလဒ်- 32766 ကြာချိန် 77.0044ms
maxEvenConjunction ရလဒ်- 32766 ကြာချိန် 109.0062ms
maxEvenConjunction2 ရလဒ်- 32766 ကြာချိန် 78.0045ms

အမြင့်ဆုံးအဆင့်- ၁၂၈
maxEvenDividing ရလဒ်- 65534 ကြာချိန် 109.0062ms
maxEvenDividing2 ရလဒ်- 65534 ကြာချိန် 75.0043ms
maxEvenConjunction ရလဒ်- 65534 ကြာချိန် 109.0063ms
maxEvenConjunction2 ရလဒ်- 65534 ကြာချိန် 79.0045ms

အမြင့်ဆုံးအဆင့်- ၁၂၈
maxEvenDividing ရလဒ်- 131070 ကြာချိန် 108.0061ms
maxEvenDividing2 ရလဒ်- 131070 ကြာချိန် 76.0044ms
maxEvenConjunction ရလဒ်- 131070 ကြာချိန် 110.0063ms
maxEvenConjunction2 ရလဒ်- 131070 ကြာချိန် 80.0046ms

အမြင့်ဆုံးအဆင့်- ၁၂၈
maxEvenDividing ရလဒ်- 262142 ကြာချိန် 110.0063ms
maxEvenDividing2 ရလဒ်- 262142 ကြာချိန် 76.0044ms
maxEvenConjunction ရလဒ်- 262142 ကြာချိန် 107.0061ms
maxEvenConjunction2 ရလဒ်- 262142 ကြာချိန် 78.0044ms

အမြင့်ဆုံးအဆင့်- ၁၂၈
maxEvenDividing ရလဒ်- 524286 ကြာချိန် 109.0062ms
maxEvenDividing2 ရလဒ်- 524286 ကြာချိန် 78.0045ms
maxEvenConjunction ရလဒ်- 524286 ကြာချိန် 109.0062ms
maxEvenConjunction2 ရလဒ်- 524286 ကြာချိန် 80.0046ms

အမြင့်ဆုံးအဆင့်- ၁၂၈
maxEvenDividing ရလဒ်- 1048574 ကြာချိန် 109.0063ms
maxEvenDividing2 ရလဒ်- 1048574 ကြာချိန် 80.0045ms
maxEvenConjunction ရလဒ်- 1048574 ကြာချိန် 114.0066ms
maxEvenConjunction2 ရလဒ်- 1048574 ကြာချိန် 78.0044ms

အမြင့်ဆုံးအဆင့်- ၁၂၈
maxEvenDividing ရလဒ်- 2097150 ကြာချိန် 111.0064ms
maxEvenDividing2 ရလဒ်- 2097150 ကြာချိန် 79.0045ms
maxEvenConjunction ရလဒ်- 2097150 ကြာချိန် 112.0064ms
maxEvenConjunction2 ရလဒ်- 2097150 ကြာချိန် 77.0044ms

အမြင့်ဆုံးအဆင့်- ၁၂၈
maxEvenDividing ရလဒ်- 4194302 ကြာချိန် 111.0063ms
maxEvenDividing2 ရလဒ်- 4194302 ကြာချိန် 78.0045ms
maxEvenConjunction ရလဒ်- 4194302 ကြာချိန် 111.0063ms
maxEvenConjunction2 ရလဒ်- 4194302 ကြာချိန် 77.0044ms

အမြင့်ဆုံးအဆင့်- ၁၂၈
maxEvenDividing ရလဒ်- 8388606 ကြာချိန် 109.0062ms
maxEvenDividing2 ရလဒ်- 8388606 ကြာချိန် 78.0045ms
maxEvenConjunction ရလဒ်- 8388606 ကြာချိန် 114.0065ms
maxEvenConjunction2 ရလဒ်- 8388606 ကြာချိန် 78.0045ms

အမြင့်ဆုံးအဆင့်- ၁၂၈
maxEvenDividing ရလဒ်- 16777214 ကြာချိန် 109.0062ms
maxEvenDividing2 ရလဒ်- 16777214 ကြာချိန် 77.0044ms
maxEvenConjunction ရလဒ်- 16777214 ကြာချိန် 109.0063ms
maxEvenConjunction2 ရလဒ်- 16777214 ကြာချိန် 77.0044ms

အမြင့်ဆုံးအဆင့်- ၁၂၈
maxEvenDividing ရလဒ်- 33554430 ကြာချိန် 113.0065ms
maxEvenDividing2 ရလဒ်- 33554430 ကြာချိန် 78.0045ms
maxEvenConjunction ရလဒ်- 33554430 ကြာချိန် 110.0063ms
maxEvenConjunction2 ရလဒ်- 33554430 ကြာချိန် 80.0045ms

အမြင့်ဆုံးအဆင့်- ၁၂၈
maxEvenDividing ရလဒ်- 67108860 ကြာချိန် 112.0064ms
maxEvenDividing2 ရလဒ်- 67108860 ကြာချိန် 77.0044ms
maxEvenConjunction ရလဒ်- 67108860 ကြာချိန် 112.0064ms
maxEvenConjunction2 ရလဒ်- 67108860 ကြာချိန် 80.0046ms

အမြင့်ဆုံးအဆင့်- ၁၂၈
maxEvenDividing ရလဒ်- 134217726 ကြာချိန် 109.0063ms
maxEvenDividing2 ရလဒ်- 134217726 ကြာချိန် 78.0044ms
maxEvenConjunction ရလဒ်- 134217726 ကြာချိန် 114.0065ms
maxEvenConjunction2 ရလဒ်- 134217726 ကြာချိန် 81.0047ms

အမြင့်ဆုံးအဆင့်- ၁၂၈
maxEvenDividing ရလဒ်- 268435446 ကြာချိန် 111.0064ms
maxEvenDividing2 ရလဒ်- 268435446 ကြာချိန် 79.0045ms
maxEvenConjunction ရလဒ်- 268435446 ကြာချိန် 114.0065ms
maxEvenConjunction2 ရလဒ်- 268435446 ကြာချိန် 79.0045ms

အမြင့်ဆုံးအဆင့်- ၁၂၈
maxEvenDividing ရလဒ်- 536870910 ကြာချိန် 107.0062ms
maxEvenDividing2 ရလဒ်- 536870910 ကြာချိန် 76.0043ms
maxEvenConjunction ရလဒ်- 536870910 ကြာချိန် 109.0062ms
maxEvenConjunction2 ရလဒ်- 536870910 ကြာချိန် 80.0046ms

Go compiler သည် ကုဒ်ကို အကောင်းဆုံးမဖြစ်အောင် လုပ်ဆောင်ပြီး ပထမတစ်ခုသည် လွဲမှားနေသော်လည်း ဒုတိယအခြေအနေအား အမြဲတမ်းစစ်ဆေးနေသောကြောင့် ရှင်းရှင်းလင်းလင်းရှင်းပြချက်ကို ကျွန်ုပ်ရှာမတွေ့ပါ။ ဒါမှမဟုတ် ငါ့မျက်လုံးတွေက မှုန်ဝါးနေပြီး သိသာထင်ရှားတဲ့ အမှားကို မတွေ့ဘူးလား။ သို့မဟုတ် compiler အား အထူးညွှန်ကြားချက်များ ပေးရန်လိုအပ်ပါသလား။ ဆင်ခြင်တုံတရားရှိသော မှတ်ချက်များအတွက် ဝမ်းမြောက်မိပါသည်။

PS: ဟုတ်ကဲ့၊ ပျော်စရာအတွက်ပဲ၊ Java 5 နဲ့ Java 7/8 မှာ အလားတူစမ်းသပ်မှုတွေကို လုပ်ဆောင်ခဲ့တယ် - အားလုံးရှင်းပါတယ်၊ အကောင်အထည်ဖော်ချိန်က အတူတူပါပဲ။

source: www.habr.com

မှတ်ချက် Add