Heverinao ve fa mitovy amin'ny zava-bita ve ireo safidy roa ireo amin'ny fitsapana fepetra ao anaty loop?
if a > b && c*2 > d {
....
}
// ΠΈ
if a <= b {
continue;
}
if c*2 > d {
....
}
Nanomboka tamin'ny "fanafanana ny ati-doha" izany rehetra izany; Tsy maintsy nanome ohatra momba ny fikarohana tsara indrindra momba ny isa lehibe indrindra amin'ny isa maromaro aho [-x....x]. Nanontany tena aho hoe ohatrinona no mety ho fampisehoana tsara kokoa raha mampiasa fampitomboana lojika amin'ny 1 aho mba hamantarana ny isa iray na tsia.
//Ρ ΡΠ΅ΡΠ½ΡΡ
ΡΠΈΡΠ΅Π» ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ Π±ΠΈΡ Π²ΡΠ΅Π³Π΄Π° ΡΠ°Π²Π΅Π½ 0
value & 1 == 0
//vs ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄
value % 2 == 0
Ny traikefako momba ny fandaharana ao amin'ny Go dia tsy dia mivelatra loatra, mihoatra ny herintaona sy tapany, nampiasa azy io aho, na dia matetika aza, fa natao ho an'ny tanjona utilitarian (tsara, angamba afa-tsy amin'ny tetikasa iray mifandraika amin'ny serivisy http be entana), noho izany aho nanomboka tamin'izany. Sokafy ny GoLand ary manorata fitsapana tsotra
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
}
Mahazo valiny isika izay mampiseho fa arakaraka ny avoakan'ny tokonana no miseho matetika ny fiovaovan'ny zava-bita.
Mampitahamax 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
Mazava fa amin'ity tranga ity, ho an'ny tokonam-baravarana samihafa dia manana angon-drakitra fitsapana samihafa isika, ny enta-mavesatry ny processeur (amin'ny solosainako i5-2540M) dia miovaova manodidina ny 20..30%, ny fitadidiana nofehezin'ny fampiharana mandeha amin'ny GoLand dia eo ho eo. manodidina ny 813MB - izany koa dia misy fiantraikany amin'ny fahamendrehan'ny vokatra, mila mitahiry tranga fitsapana amin'ny kapila ianao ary manatanteraka fitsapana rehetra ho an'ny tokonam-baravarana tsirairay mitokana.
Ary ankehitriny, mieritreritra ny fomba hampiharana izany rehetra izany amin'ny vidiny kely indrindra, manitsy ho azy ny fanamarinana ny fepetra
if value > current && value&1 == 0 {
current = value
}
amin'ny
if value <= current {
continue;
}
if value&1 == 0 {
current = value
}
Manao ny fitsapana indray aho ... ary tsy mahazo na inona na inona aho :)
Ny fotoana lany amin'ny famonoana dia manomboka tsy mitovy amin'ny isan-jaton'ny isan-jaton'ny isan-jato, fa amin'ny 10..15%. Manampy fitsapana 2 fanampiny haingana aho:
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
}
Nihazakazaka aho ary nahazo ity sary ity:fahaiza-manao array voalohany: 100000000
fetra farany ambony: 128
maxEvenDividing valiny: 126 faharetana 116.0066ms
valiny maxEvenDividing2: 126 maharitra 79.0045ms
Valiny maxEvenConjunction: 126 maharitra 114.0065ms
valiny maxEvenConjunction2: 126 maharitra 83.0048ms
fetra farany ambony: 256
maxEvenDividing valiny: 254 faharetana 111.0063ms
valiny maxEvenDividing2: 254 maharitra 77.0044ms
Valiny maxEvenConjunction: 254 maharitra 110.0063ms
valiny maxEvenConjunction2: 254 maharitra 80.0046ms
fetra farany ambony: 512
maxEvenDividing valiny: 510 faharetana 114.0066ms
valiny maxEvenDividing2: 510 maharitra 80.0045ms
Valiny maxEvenConjunction: 510 maharitra 110.0063ms
valiny maxEvenConjunction2: 510 maharitra 80.0046ms
fetra farany ambony: 1024
maxEvenDividing valiny: 1022 faharetana 109.0063ms
valiny maxEvenDividing2: 1022 maharitra 77.0044ms
Valiny maxEvenConjunction: 1022 maharitra 111.0063ms
valiny maxEvenConjunction2: 1022 maharitra 81.0047ms
fetra farany ambony: 2048
maxEvenDividing valiny: 2046 faharetana 114.0065ms
valiny maxEvenDividing2: 2046 maharitra 79.0045ms
Valiny maxEvenConjunction: 2046 maharitra 113.0065ms
valiny maxEvenConjunction2: 2046 maharitra 81.0046ms
fetra farany ambony: 4096
maxEvenDividing valiny: 4094 faharetana 114.0065ms
valiny maxEvenDividing2: 4094 maharitra 80.0046ms
Valiny maxEvenConjunction: 4094 maharitra 111.0063ms
valiny maxEvenConjunction2: 4094 maharitra 78.0045ms
fetra farany ambony: 8192
maxEvenDividing valiny: 8190 faharetana 107.0062ms
valiny maxEvenDividing2: 8190 maharitra 77.0044ms
Valiny maxEvenConjunction: 8190 maharitra 111.0063ms
valiny maxEvenConjunction2: 8190 maharitra 77.0044ms
fetra farany ambony: 16384
maxEvenDividing valiny: 16382 faharetana 109.0063ms
valiny maxEvenDividing2: 16382 maharitra 77.0044ms
Valiny maxEvenConjunction: 16382 maharitra 108.0062ms
valiny maxEvenConjunction2: 16382 maharitra 77.0044ms
fetra farany ambony: 32768
maxEvenDividing valiny: 32766 faharetana 112.0064ms
valiny maxEvenDividing2: 32766 maharitra 77.0044ms
Valiny maxEvenConjunction: 32766 maharitra 109.0062ms
valiny maxEvenConjunction2: 32766 maharitra 78.0045ms
fetra farany ambony: 65536
maxEvenDividing valiny: 65534 faharetana 109.0062ms
valiny maxEvenDividing2: 65534 maharitra 75.0043ms
Valiny maxEvenConjunction: 65534 maharitra 109.0063ms
valiny maxEvenConjunction2: 65534 maharitra 79.0045ms
fetra farany ambony: 131072
maxEvenDividing valiny: 131070 faharetana 108.0061ms
valiny maxEvenDividing2: 131070 maharitra 76.0044ms
Valiny maxEvenConjunction: 131070 maharitra 110.0063ms
valiny maxEvenConjunction2: 131070 maharitra 80.0046ms
fetra farany ambony: 262144
maxEvenDividing valiny: 262142 faharetana 110.0063ms
valiny maxEvenDividing2: 262142 maharitra 76.0044ms
Valiny maxEvenConjunction: 262142 maharitra 107.0061ms
valiny maxEvenConjunction2: 262142 maharitra 78.0044ms
fetra farany ambony: 524288
maxEvenDividing valiny: 524286 faharetana 109.0062ms
valiny maxEvenDividing2: 524286 maharitra 78.0045ms
Valiny maxEvenConjunction: 524286 maharitra 109.0062ms
valiny maxEvenConjunction2: 524286 maharitra 80.0046ms
fetra farany ambony: 1048576
maxEvenDividing valiny: 1048574 faharetana 109.0063ms
valiny maxEvenDividing2: 1048574 maharitra 80.0045ms
Valiny maxEvenConjunction: 1048574 maharitra 114.0066ms
valiny maxEvenConjunction2: 1048574 maharitra 78.0044ms
fetra farany ambony: 2097152
maxEvenDividing valiny: 2097150 faharetana 111.0064ms
valiny maxEvenDividing2: 2097150 maharitra 79.0045ms
Valiny maxEvenConjunction: 2097150 maharitra 112.0064ms
valiny maxEvenConjunction2: 2097150 maharitra 77.0044ms
fetra farany ambony: 4194304
maxEvenDividing valiny: 4194302 faharetana 111.0063ms
valiny maxEvenDividing2: 4194302 maharitra 78.0045ms
Valiny maxEvenConjunction: 4194302 maharitra 111.0063ms
valiny maxEvenConjunction2: 4194302 maharitra 77.0044ms
fetra farany ambony: 8388608
maxEvenDividing valiny: 8388606 faharetana 109.0062ms
valiny maxEvenDividing2: 8388606 maharitra 78.0045ms
Valiny maxEvenConjunction: 8388606 maharitra 114.0065ms
valiny maxEvenConjunction2: 8388606 maharitra 78.0045ms
fetra farany ambony: 16777216
maxEvenDividing valiny: 16777214 faharetana 109.0062ms
valiny maxEvenDividing2: 16777214 maharitra 77.0044ms
Valiny maxEvenConjunction: 16777214 maharitra 109.0063ms
valiny maxEvenConjunction2: 16777214 maharitra 77.0044ms
fetra farany ambony: 33554432
maxEvenDividing valiny: 33554430 faharetana 113.0065ms
valiny maxEvenDividing2: 33554430 maharitra 78.0045ms
Valiny maxEvenConjunction: 33554430 maharitra 110.0063ms
valiny maxEvenConjunction2: 33554430 maharitra 80.0045ms
fetra farany ambony: 67108864
maxEvenDividing valiny: 67108860 faharetana 112.0064ms
valiny maxEvenDividing2: 67108860 maharitra 77.0044ms
Valiny maxEvenConjunction: 67108860 maharitra 112.0064ms
valiny maxEvenConjunction2: 67108860 maharitra 80.0046ms
fetra farany ambony: 134217728
maxEvenDividing valiny: 134217726 faharetana 109.0063ms
valiny maxEvenDividing2: 134217726 maharitra 78.0044ms
Valiny maxEvenConjunction: 134217726 maharitra 114.0065ms
valiny maxEvenConjunction2: 134217726 maharitra 81.0047ms
fetra farany ambony: 268435456
maxEvenDividing valiny: 268435446 faharetana 111.0064ms
valiny maxEvenDividing2: 268435446 maharitra 79.0045ms
Valiny maxEvenConjunction: 268435446 maharitra 114.0065ms
valiny maxEvenConjunction2: 268435446 maharitra 79.0045ms
fetra farany ambony: 536870912
maxEvenDividing valiny: 536870910 faharetana 107.0062ms
valiny maxEvenDividing2: 536870910 maharitra 76.0043ms
Valiny maxEvenConjunction: 536870910 maharitra 109.0062ms
valiny maxEvenConjunction2: 536870910 maharitra 80.0046ms
Tsy nahita fanazavana mazava aho hoe nahoana ny Go compiler no tsy manatsara ny kaody ary manamarina foana ny fepetra faharoa, na dia diso aza ny voalohany. Sa manjavozavo fotsiny ny masoko ka tsy hitako izay fahadisoana miharihary? Sa mila manome toromarika manokana ho an'ny compiler ve ianao? Faly aho amin'ny fanehoan-kevitra matotra.
Sal: Eny, ho an'ny fialamboly fotsiny, nanao fitsapana mitovy amin'izany aho tamin'ny Java 5 sy Java 7/8 - mazava ny zava-drehetra, mitovy ny fotoana famonoana.
Source: www.habr.com