ืืื ืืชื ืืืฉื ืฉืฉืชื ืืืคืฉืจืืืืช ืืืื ืืืืืงืช ืชื ืืื ืืชืื ืืืืื ืฉืืืช ืขืจื ืืืืฆืืขืื?
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
ืื ืืกืืื ืฉืื ืืชืื ืืช ื-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 - ืื ืืฉืคืืข ืื ืขื ืืืืื ืืช ืืชืืฆืื, ืืชื ืฆืจืื ืืฉืืืจ ืืงืจื ืืืืงื ืืืืกืง ืืืืจืืฅ ืืช ืื ืืืืืงืืช ืขืืืจ ืื ืกืฃ ืืื ืืชืง ืืื ืืืฉื ื.
ืืขืืฉืื, ืืฉืื ื ืืืฉื ืืื ืืืืฉื ืืช ืื ืื ืืขืืืืืช ืืื ืืืืืืช, ืื ื ืืชืงื ืืืืืืืืช ืืช ืืืืงืช ืืืฆื
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
maxEvenDividing ืชืืฆืืช: 126 ืืฉื 116.0066ms
maxEvenDividing2 ืชืืฆืื: 126 ืืฉื 79.0045ms
ืชืืฆืืช maxEvenConjunction: 126 ืืฉื 114.0065ms
maxEvenConjunction2 ืชืืฆืื: 126 ืืฉื 83.0048ms
ืกืฃ ืืงืกืืืื: 256
maxEvenDividing ืชืืฆืืช: 254 ืืฉื 111.0063ms
maxEvenDividing2 ืชืืฆืื: 254 ืืฉื 77.0044ms
ืชืืฆืืช maxEvenConjunction: 254 ืืฉื 110.0063ms
maxEvenConjunction2 ืชืืฆืื: 254 ืืฉื 80.0046ms
ืกืฃ ืืงืกืืืื: 512
maxEvenDividing ืชืืฆืืช: 510 ืืฉื 114.0066ms
maxEvenDividing2 ืชืืฆืื: 510 ืืฉื 80.0045ms
ืชืืฆืืช maxEvenConjunction: 510 ืืฉื 110.0063ms
maxEvenConjunction2 ืชืืฆืื: 510 ืืฉื 80.0046ms
ืกืฃ ืืงืกืืืื: 1024
maxEvenDividing ืชืืฆืืช: 1022 ืืฉื 109.0063ms
maxEvenDividing2 ืชืืฆืื: 1022 ืืฉื 77.0044ms
ืชืืฆืืช maxEvenConjunction: 1022 ืืฉื 111.0063ms
maxEvenConjunction2 ืชืืฆืื: 1022 ืืฉื 81.0047ms
ืกืฃ ืืงืกืืืื: 2048
maxEvenDividing ืชืืฆืืช: 2046 ืืฉื 114.0065ms
maxEvenDividing2 ืชืืฆืื: 2046 ืืฉื 79.0045ms
ืชืืฆืืช maxEvenConjunction: 2046 ืืฉื 113.0065ms
maxEvenConjunction2 ืชืืฆืื: 2046 ืืฉื 81.0046ms
ืกืฃ ืืงืกืืืื: 4096
maxEvenDividing ืชืืฆืืช: 4094 ืืฉื 114.0065ms
maxEvenDividing2 ืชืืฆืื: 4094 ืืฉื 80.0046ms
ืชืืฆืืช maxEvenConjunction: 4094 ืืฉื 111.0063ms
maxEvenConjunction2 ืชืืฆืื: 4094 ืืฉื 78.0045ms
ืกืฃ ืืงืกืืืื: 8192
maxEvenDividing ืชืืฆืืช: 8190 ืืฉื 107.0062ms
maxEvenDividing2 ืชืืฆืื: 8190 ืืฉื 77.0044ms
ืชืืฆืืช maxEvenConjunction: 8190 ืืฉื 111.0063ms
maxEvenConjunction2 ืชืืฆืื: 8190 ืืฉื 77.0044ms
ืกืฃ ืืงืกืืืื: 16384
maxEvenDividing ืชืืฆืืช: 16382 ืืฉื 109.0063ms
maxEvenDividing2 ืชืืฆืื: 16382 ืืฉื 77.0044ms
ืชืืฆืืช maxEvenConjunction: 16382 ืืฉื 108.0062ms
maxEvenConjunction2 ืชืืฆืื: 16382 ืืฉื 77.0044ms
ืกืฃ ืืงืกืืืื: 32768
maxEvenDividing ืชืืฆืืช: 32766 ืืฉื 112.0064ms
maxEvenDividing2 ืชืืฆืื: 32766 ืืฉื 77.0044ms
ืชืืฆืืช maxEvenConjunction: 32766 ืืฉื 109.0062ms
maxEvenConjunction2 ืชืืฆืื: 32766 ืืฉื 78.0045ms
ืกืฃ ืืงืกืืืื: 65536
maxEvenDividing ืชืืฆืืช: 65534 ืืฉื 109.0062ms
maxEvenDividing2 ืชืืฆืื: 65534 ืืฉื 75.0043ms
ืชืืฆืืช maxEvenConjunction: 65534 ืืฉื 109.0063ms
maxEvenConjunction2 ืชืืฆืื: 65534 ืืฉื 79.0045ms
ืกืฃ ืืงืกืืืื: 131072
maxEvenDividing ืชืืฆืืช: 131070 ืืฉื 108.0061ms
maxEvenDividing2 ืชืืฆืื: 131070 ืืฉื 76.0044ms
ืชืืฆืืช maxEvenConjunction: 131070 ืืฉื 110.0063ms
maxEvenConjunction2 ืชืืฆืื: 131070 ืืฉื 80.0046ms
ืกืฃ ืืงืกืืืื: 262144
maxEvenDividing ืชืืฆืืช: 262142 ืืฉื 110.0063ms
maxEvenDividing2 ืชืืฆืื: 262142 ืืฉื 76.0044ms
ืชืืฆืืช maxEvenConjunction: 262142 ืืฉื 107.0061ms
maxEvenConjunction2 ืชืืฆืื: 262142 ืืฉื 78.0044ms
ืกืฃ ืืงืกืืืื: 524288
maxEvenDividing ืชืืฆืืช: 524286 ืืฉื 109.0062ms
maxEvenDividing2 ืชืืฆืื: 524286 ืืฉื 78.0045ms
ืชืืฆืืช maxEvenConjunction: 524286 ืืฉื 109.0062ms
maxEvenConjunction2 ืชืืฆืื: 524286 ืืฉื 80.0046ms
ืกืฃ ืืงืกืืืื: 1048576
maxEvenDividing ืชืืฆืืช: 1048574 ืืฉื 109.0063ms
maxEvenDividing2 ืชืืฆืื: 1048574 ืืฉื 80.0045ms
ืชืืฆืืช maxEvenConjunction: 1048574 ืืฉื 114.0066ms
maxEvenConjunction2 ืชืืฆืื: 1048574 ืืฉื 78.0044ms
ืกืฃ ืืงืกืืืื: 2097152
maxEvenDividing ืชืืฆืืช: 2097150 ืืฉื 111.0064ms
maxEvenDividing2 ืชืืฆืื: 2097150 ืืฉื 79.0045ms
ืชืืฆืืช maxEvenConjunction: 2097150 ืืฉื 112.0064ms
maxEvenConjunction2 ืชืืฆืื: 2097150 ืืฉื 77.0044ms
ืกืฃ ืืงืกืืืื: 4194304
maxEvenDividing ืชืืฆืืช: 4194302 ืืฉื 111.0063ms
maxEvenDividing2 ืชืืฆืื: 4194302 ืืฉื 78.0045ms
ืชืืฆืืช maxEvenConjunction: 4194302 ืืฉื 111.0063ms
maxEvenConjunction2 ืชืืฆืื: 4194302 ืืฉื 77.0044ms
ืกืฃ ืืงืกืืืื: 8388608
maxEvenDividing ืชืืฆืืช: 8388606 ืืฉื 109.0062ms
maxEvenDividing2 ืชืืฆืื: 8388606 ืืฉื 78.0045ms
ืชืืฆืืช maxEvenConjunction: 8388606 ืืฉื 114.0065ms
maxEvenConjunction2 ืชืืฆืื: 8388606 ืืฉื 78.0045ms
ืกืฃ ืืงืกืืืื: 16777216
maxEvenDividing ืชืืฆืืช: 16777214 ืืฉื 109.0062ms
maxEvenDividing2 ืชืืฆืื: 16777214 ืืฉื 77.0044ms
ืชืืฆืืช maxEvenConjunction: 16777214 ืืฉื 109.0063ms
maxEvenConjunction2 ืชืืฆืื: 16777214 ืืฉื 77.0044ms
ืกืฃ ืืงืกืืืื: 33554432
maxEvenDividing ืชืืฆืืช: 33554430 ืืฉื 113.0065ms
maxEvenDividing2 ืชืืฆืื: 33554430 ืืฉื 78.0045ms
ืชืืฆืืช maxEvenConjunction: 33554430 ืืฉื 110.0063ms
maxEvenConjunction2 ืชืืฆืื: 33554430 ืืฉื 80.0045ms
ืกืฃ ืืงืกืืืื: 67108864
maxEvenDividing ืชืืฆืืช: 67108860 ืืฉื 112.0064ms
maxEvenDividing2 ืชืืฆืื: 67108860 ืืฉื 77.0044ms
ืชืืฆืืช maxEvenConjunction: 67108860 ืืฉื 112.0064ms
maxEvenConjunction2 ืชืืฆืื: 67108860 ืืฉื 80.0046ms
ืกืฃ ืืงืกืืืื: 134217728
maxEvenDividing ืชืืฆืืช: 134217726 ืืฉื 109.0063ms
maxEvenDividing2 ืชืืฆืื: 134217726 ืืฉื 78.0044ms
ืชืืฆืืช maxEvenConjunction: 134217726 ืืฉื 114.0065ms
maxEvenConjunction2 ืชืืฆืื: 134217726 ืืฉื 81.0047ms
ืกืฃ ืืงืกืืืื: 268435456
maxEvenDividing ืชืืฆืืช: 268435446 ืืฉื 111.0064ms
maxEvenDividing2 ืชืืฆืื: 268435446 ืืฉื 79.0045ms
ืชืืฆืืช maxEvenConjunction: 268435446 ืืฉื 114.0065ms
maxEvenConjunction2 ืชืืฆืื: 268435446 ืืฉื 79.0045ms
ืกืฃ ืืงืกืืืื: 536870912
maxEvenDividing ืชืืฆืืช: 536870910 ืืฉื 107.0062ms
maxEvenDividing2 ืชืืฆืื: 536870910 ืืฉื 76.0043ms
ืชืืฆืืช maxEvenConjunction: 536870910 ืืฉื 109.0062ms
maxEvenConjunction2 ืชืืฆืื: 536870910 ืืฉื 80.0046ms
ืื ืืฆืืืชื ืืืฆืื ืืกืืจ ืืจืืจ ืืื ืืืืืจ ืฉื Go ืื ืืืืขื ืืช ืืงืื ืืชืืื ืืืืง ืืช ืืชื ืื ืืฉื ื, ืื ืื ืืจืืฉืื ืืื ืฉืงืจ. ืื ืฉืืืื ืืขืื ืืื ืฉืื ืคืฉืื ืืืืฉืืฉืืช ืืื ื ืื ืจืืื ืฉืื ืืขืืช ืืจืืจื? ืื ืฉืืชื ืฆืจืื ืืกืคืง ืืื ืืืจืืืช ืืืืืืืช ืืืืืจ? ืืฉืื ืืชืืืืืช ืืืืื ืืืช.
ื .ื.: ืื, ืกืชื ืืฉืืื ืืืืฃ, ืืจืฆืชื ืืืืงืืช ืืืืืช ืขื Java 5 ื-Java 7/8 - ืืื ืืจืืจ, ืืื ืืืืฆืืข ืืื.
ืืงืืจ: www.habr.com