ααΎβα’αααβαα·αβααΆβαααααΎαβααΆααβααΈαβαααβαααααΆααβααααααααβααβααΆαβααΆαααααβαα βαααα»αβααααααβαα½αβααΊβααααΌαβαααα»αβααΆαβα’αα»αααα?
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
ααααα·αα’αα·ααααΆα α‘α’α¨
αααααα 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 αα·ααααααΎαααααα·αααααΆαααΌα α αΎαααααααα·αα·αααααΎαααααααααααΈααΈα ααΎαααααΈααΆααΈαα½ααα·ααα·ααααααα α¬αααα ααααΆααααααααααααα»αααααΆαααααααα·α α αΎααααα»ααα·αααΎαααΆαααα α»αα αααΆααααΆαααα? α¬ααΎα’αααααααΌαααΆααααααααΆαααααΆααα·ααααα½αα ααα½ααααα’αααα ααααα? αααα»αβααΉαβααΈαααΆαβα ααααβααα·βαααβααα ααα»ααααα
PS: ααΆα/α αΆα ααΎααααΈααΆααααααΆαααΈαααΆα αααα»αααΆαααααΎαααΆαααΆαααααΎαααααααααααααααΆαα ααΎ Java 5 αα·α Java 7/8 - α’αααΈααααααααΆαααΊα αααΆαα αααααααΆααααα·ααααα·ααΊααΌα ααααΆα
ααααα: www.habr.com