Ṣ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