گو ۾ حالتون ۽ انهن جا نرالا

ڇا توهان سوچيو ٿا ته اهي ٻه آپشن ٽيسٽ جي حالتن لاءِ هڪ لوپ اندر ڪارڪردگي ۾ برابر آهن؟

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


اهو سڀ ڪجهه ”برين وارم اپ“ سان شروع ٿيو؛ مون کي انٽيجرز [-x....x] جي صف ۾ سڀ کان وڏي برابر نمبر لاءِ بهترين ڳولا جو مثال ڏيڻو هو. مان سوچي رهيو هئس ته ڪيتري بهتر ڪارڪردگي هوندي جيڪڏهن مان 1 سان منطقي ضرب استعمال ڪريان ته اهو معلوم ڪرڻ لاءِ ته نمبر برابر آهي يا نه.


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

گو ۾ منهنجو پروگرامنگ جو تجربو تمام گهڻو وسيع نه آهي، صرف هڪ اڌ سال کان مٿي، مون ان کي استعمال ڪيو، جيتوڻيڪ اڪثر، پر خالص طور تي استعمال جي مقصدن لاءِ (سٺو، شايد هڪ پروجيڪٽ جي سواءِ هڪ اعليٰ لوڊ 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٪ مختلف آهي، گو لينڊ کان هلندڙ ايپليڪيشن تي قبضو ڪيل ميموري اوسط تي آهي. اٽڪل 813MB - اهو پڻ نتيجو جي اعتبار کي متاثر ڪري ٿو، توهان کي ڊسڪ تي ٽيسٽ ڪيس محفوظ ڪرڻ جي ضرورت آهي ۽ هڪ ٻئي کان الڳ ٿيڻ ۾ هر حد لاء سڀني ٽيسٽ کي هلائڻ جي ضرورت آهي.

۽ هاڻي، سوچڻ جي باري ۾ اهو سڀ ڪجهه گهٽ ۾ گهٽ خرچن سان ڪيئن لاڳو ڪجي، مان پاڻمرادو درست ڪريان ٿو شرط جي چڪاس

		
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
}

مان ان کي هلايو ۽ هي تصوير حاصل ڪريان:شروعاتي صف جي گنجائش: 100000000

وڌ ۾ وڌ حد: 128
maxEven Dividing نتيجو: 126 عرصو 116.0066ms
maxEvenDivding2 نتيجو: 126 عرصو 79.0045ms
maxEvenConjunction نتيجو: 126 عرصو 114.0065ms
maxEvenConjunction2 نتيجو: 126 عرصو 83.0048ms

وڌ ۾ وڌ حد: 256
maxEven Dividing نتيجو: 254 عرصو 111.0063ms
maxEvenDivding2 نتيجو: 254 عرصو 77.0044ms
maxEvenConjunction نتيجو: 254 عرصو 110.0063ms
maxEvenConjunction2 نتيجو: 254 عرصو 80.0046ms

وڌ ۾ وڌ حد: 512
maxEven Dividing نتيجو: 510 عرصو 114.0066ms
maxEvenDivding2 نتيجو: 510 عرصو 80.0045ms
maxEvenConjunction نتيجو: 510 عرصو 110.0063ms
maxEvenConjunction2 نتيجو: 510 عرصو 80.0046ms

وڌ ۾ وڌ حد: 1024
maxEven Dividing نتيجو: 1022 عرصو 109.0063ms
maxEvenDivding2 نتيجو: 1022 عرصو 77.0044ms
maxEvenConjunction نتيجو: 1022 عرصو 111.0063ms
maxEvenConjunction2 نتيجو: 1022 عرصو 81.0047ms

وڌ ۾ وڌ حد: 2048
maxEven Dividing نتيجو: 2046 عرصو 114.0065ms
maxEvenDivding2 نتيجو: 2046 عرصو 79.0045ms
maxEvenConjunction نتيجو: 2046 عرصو 113.0065ms
maxEvenConjunction2 نتيجو: 2046 عرصو 81.0046ms

وڌ ۾ وڌ حد: 4096
maxEven Dividing نتيجو: 4094 عرصو 114.0065ms
maxEvenDivding2 نتيجو: 4094 عرصو 80.0046ms
maxEvenConjunction نتيجو: 4094 عرصو 111.0063ms
maxEvenConjunction2 نتيجو: 4094 عرصو 78.0045ms

وڌ ۾ وڌ حد: 8192
maxEven Dividing نتيجو: 8190 عرصو 107.0062ms
maxEvenDivding2 نتيجو: 8190 عرصو 77.0044ms
maxEvenConjunction نتيجو: 8190 عرصو 111.0063ms
maxEvenConjunction2 نتيجو: 8190 عرصو 77.0044ms

وڌ ۾ وڌ حد: 16384
maxEven Dividing نتيجو: 16382 عرصو 109.0063ms
maxEvenDivding2 نتيجو: 16382 عرصو 77.0044ms
maxEvenConjunction نتيجو: 16382 عرصو 108.0062ms
maxEvenConjunction2 نتيجو: 16382 عرصو 77.0044ms

وڌ ۾ وڌ حد: 32768
maxEven Dividing نتيجو: 32766 عرصو 112.0064ms
maxEvenDivding2 نتيجو: 32766 عرصو 77.0044ms
maxEvenConjunction نتيجو: 32766 عرصو 109.0062ms
maxEvenConjunction2 نتيجو: 32766 عرصو 78.0045ms

وڌ ۾ وڌ حد: 65536
maxEven Dividing نتيجو: 65534 عرصو 109.0062ms
maxEvenDivding2 نتيجو: 65534 عرصو 75.0043ms
maxEvenConjunction نتيجو: 65534 عرصو 109.0063ms
maxEvenConjunction2 نتيجو: 65534 عرصو 79.0045ms

وڌ ۾ وڌ حد: 131072
maxEven Dividing نتيجو: 131070 عرصو 108.0061ms
maxEvenDivding2 نتيجو: 131070 عرصو 76.0044ms
maxEvenConjunction نتيجو: 131070 عرصو 110.0063ms
maxEvenConjunction2 نتيجو: 131070 عرصو 80.0046ms

وڌ ۾ وڌ حد: 262144
maxEven Dividing نتيجو: 262142 عرصو 110.0063ms
maxEvenDivding2 نتيجو: 262142 عرصو 76.0044ms
maxEvenConjunction نتيجو: 262142 عرصو 107.0061ms
maxEvenConjunction2 نتيجو: 262142 عرصو 78.0044ms

وڌ ۾ وڌ حد: 524288
maxEven Dividing نتيجو: 524286 عرصو 109.0062ms
maxEvenDivding2 نتيجو: 524286 عرصو 78.0045ms
maxEvenConjunction نتيجو: 524286 عرصو 109.0062ms
maxEvenConjunction2 نتيجو: 524286 عرصو 80.0046ms

وڌ ۾ وڌ حد: 1048576
maxEven Dividing نتيجو: 1048574 عرصو 109.0063ms
maxEvenDivding2 نتيجو: 1048574 عرصو 80.0045ms
maxEvenConjunction نتيجو: 1048574 عرصو 114.0066ms
maxEvenConjunction2 نتيجو: 1048574 عرصو 78.0044ms

وڌ ۾ وڌ حد: 2097152
maxEven Dividing نتيجو: 2097150 عرصو 111.0064ms
maxEvenDivding2 نتيجو: 2097150 عرصو 79.0045ms
maxEvenConjunction نتيجو: 2097150 عرصو 112.0064ms
maxEvenConjunction2 نتيجو: 2097150 عرصو 77.0044ms

وڌ ۾ وڌ حد: 4194304
maxEven Dividing نتيجو: 4194302 عرصو 111.0063ms
maxEvenDivding2 نتيجو: 4194302 عرصو 78.0045ms
maxEvenConjunction نتيجو: 4194302 عرصو 111.0063ms
maxEvenConjunction2 نتيجو: 4194302 عرصو 77.0044ms

وڌ ۾ وڌ حد: 8388608
maxEven Dividing نتيجو: 8388606 عرصو 109.0062ms
maxEvenDivding2 نتيجو: 8388606 عرصو 78.0045ms
maxEvenConjunction نتيجو: 8388606 عرصو 114.0065ms
maxEvenConjunction2 نتيجو: 8388606 عرصو 78.0045ms

وڌ ۾ وڌ حد: 16777216
maxEven Dividing نتيجو: 16777214 عرصو 109.0062ms
maxEvenDivding2 نتيجو: 16777214 عرصو 77.0044ms
maxEvenConjunction نتيجو: 16777214 عرصو 109.0063ms
maxEvenConjunction2 نتيجو: 16777214 عرصو 77.0044ms

وڌ ۾ وڌ حد: 33554432
maxEven Dividing نتيجو: 33554430 عرصو 113.0065ms
maxEvenDivding2 نتيجو: 33554430 عرصو 78.0045ms
maxEvenConjunction نتيجو: 33554430 عرصو 110.0063ms
maxEvenConjunction2 نتيجو: 33554430 عرصو 80.0045ms

وڌ ۾ وڌ حد: 67108864
maxEven Dividing نتيجو: 67108860 عرصو 112.0064ms
maxEvenDivding2 نتيجو: 67108860 عرصو 77.0044ms
maxEvenConjunction نتيجو: 67108860 عرصو 112.0064ms
maxEvenConjunction2 نتيجو: 67108860 عرصو 80.0046ms

وڌ ۾ وڌ حد: 134217728
maxEven Dividing نتيجو: 134217726 عرصو 109.0063ms
maxEvenDivding2 نتيجو: 134217726 عرصو 78.0044ms
maxEvenConjunction نتيجو: 134217726 عرصو 114.0065ms
maxEvenConjunction2 نتيجو: 134217726 عرصو 81.0047ms

وڌ ۾ وڌ حد: 268435456
maxEven Dividing نتيجو: 268435446 عرصو 111.0064ms
maxEvenDivding2 نتيجو: 268435446 عرصو 79.0045ms
maxEvenConjunction نتيجو: 268435446 عرصو 114.0065ms
maxEvenConjunction2 نتيجو: 268435446 عرصو 79.0045ms

وڌ ۾ وڌ حد: 536870912
maxEven Dividing نتيجو: 536870910 عرصو 107.0062ms
maxEvenDivding2 نتيجو: 536870910 عرصو 76.0043ms
maxEvenConjunction نتيجو: 536870910 عرصو 109.0062ms
maxEvenConjunction2 نتيجو: 536870910 عرصو 80.0046ms

مان واضع وضاحت نه ڳولي سگهيس ڇو ته Go compiler ڪوڊ کي بهتر نٿو ڪري ۽ هميشه ٻئي حالت کي چيڪ ڪري ٿو، جيتوڻيڪ پهريون غلط آهي. يا ٿي سگهي ٿو ته منهنجيون اکيون ڌوٻي آهن ۽ مون کي ڪا واضح غلطي نظر نه ٿي اچي؟ يا ڇا توهان کي گڏ ڪرڻ واري کي ڪجهه خاص هدايتون مهيا ڪرڻ جي ضرورت آهي؟ مان سمجھدار رايا لاء خوش ٿيندس.

پي ها، صرف مزي لاءِ، مون جاوا 5 ۽ جاوا 7/8 تي ​​ساڳيا تجربا ڪيا - سڀ ڪجهه واضح آهي، عملدرآمد جو وقت ساڳيو آهي.

جو ذريعو: www.habr.com

تبصرو شامل ڪريو