Putasne hae duae optiones intra ansam tentandi condiciones in effectu aequiparantur?
if a > b && c*2 > d {
....
}
// ΠΈ
if a <= b {
continue;
}
if c*2 > d {
....
}
Omnia cum "cerebro fermentum" inchoata sunt, exemplum optimae inquisitionis dare debebam pro numero maximo in numero integrorum numerorum [-x....x]. Mirabar quanto melius effectus esset si multiplicationem logicam per 1 designarem ad instar num numerus par sit vel non.
//Ρ ΡΠ΅ΡΠ½ΡΡ
ΡΠΈΡΠ΅Π» ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ Π±ΠΈΡ Π²ΡΠ΅Π³Π΄Π° ΡΠ°Π²Π΅Π½ 0
value & 1 == 0
//vs ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄
value % 2 == 0
Mea programmandi experientia in Go non valde ampla est, tantum supra annum et dimidium, ea usus sum, etsi saepe, sed pure ad utiles usus (bene, maybe except for one project related to a high-load http service), sic ego inchoatum est. Aperi GoLand et scribe simplex test
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
}
Consequuntur ut ostendat superiora limina, eo saepius ambigua in effectu apparent.
Comparemax 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
Patet hoc casu, pro diversis liminibus nos habere varias notitias testium, processus onus (in meo i5-2540M laptop) variat circa 20..30%, memoria occupata applicationis e GoLand in mediocris est. circa 813MB - hoc quoque fidem eventus afficit, debes ut casus experimentorum in disco servare et omnes probationes pro quolibet limine separatim ab invicem currere.
Nunc autem cogitans quomodo haec omnia minimis sumptibus efficiant, automatice condicionem reprehendo corrigo
if value > current && value&1 == 0 {
current = value
}
on
if value <= current {
continue;
}
if value&1 == 0 {
current = value
}
Probat iterum curro ... et desino aliquid intelligere :)
Tempus executionis incipit non amplius ab cento / centonibus, sed a 10..15% differre.
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
}
Curro eam atque hanc imaginem:initialis ordinata capacitas: 100000000
max limina: 128
maxEvenDividing result: 126 duration
maxEvenDividing2 result: 126 duration
maxEvenConjunction result: 126. duration 114.0065ms
maxEvenConjunction2 result: 126 duration, 83.0048ms
max limina: 256
maxEvenDividing result: 254 duration
maxEvenDividing2 result: 254 duration
maxEvenConjunction result: 254. duration 110.0063ms
maxEvenConjunction2 result: 254 duration, 80.0046ms
max limina: 512
maxEvenDividing result: 510 duration
maxEvenDividing2 result: 510 duration
maxEvenConjunction result: 510. duration 110.0063ms
maxEvenConjunction2 result: 510 duration, 80.0046ms
max limina: 1024
maxEvenDividing result: 1022 duration
maxEvenDividing2 result: 1022 duration
maxEvenConjunction result: 1022. duration 111.0063ms
maxEvenConjunction2 result: 1022 duration, 81.0047ms
max limina: 2048
maxEvenDividing result: 2046 duration
maxEvenDividing2 result: 2046 duration
maxEvenConjunction result: 2046. duration 113.0065ms
maxEvenConjunction2 result: 2046 duration, 81.0046ms
max limina: 4096
maxEvenDividing result: 4094 duration
maxEvenDividing2 result: 4094 duration
maxEvenConjunction result: 4094. duration 111.0063ms
maxEvenConjunction2 result: 4094 duration, 78.0045ms
max limina: 8192
maxEvenDividing result: 8190 duration
maxEvenDividing2 result: 8190 duration
maxEvenConjunction result: 8190. duration 111.0063ms
maxEvenConjunction2 result: 8190 duration, 77.0044ms
max limina: 16384
maxEvenDividing result: 16382 duration
maxEvenDividing2 result: 16382 duration
maxEvenConjunction result: 16382. duration 108.0062ms
maxEvenConjunction2 result: 16382 duration, 77.0044ms
max limina: 32768
maxEvenDividing result: 32766 duration
maxEvenDividing2 result: 32766 duration
maxEvenConjunction result: 32766. duration 109.0062ms
maxEvenConjunction2 result: 32766 duration, 78.0045ms
max limina: 65536
maxEvenDividing result: 65534 duration
maxEvenDividing2 result: 65534 duration
maxEvenConjunction result: 65534. duration 109.0063ms
maxEvenConjunction2 result: 65534 duration, 79.0045ms
max limina: 131072
maxEvenDividing result: 131070 duration
maxEvenDividing2 result: 131070 duration
maxEvenConjunction result: 131070. duration 110.0063ms
maxEvenConjunction2 result: 131070 duration, 80.0046ms
max limina: 262144
maxEvenDividing result: 262142 duration
maxEvenDividing2 result: 262142 duration
maxEvenConjunction result: 262142. duration 107.0061ms
maxEvenConjunction2 result: 262142 duration, 78.0044ms
max limina: 524288
maxEvenDividing result: 524286 duration
maxEvenDividing2 result: 524286 duration
maxEvenConjunction result: 524286. duration 109.0062ms
maxEvenConjunction2 result: 524286 duration, 80.0046ms
max limina: 1048576
maxEvenDividing result: 1048574 duration
maxEvenDividing2 result: 1048574 duration
maxEvenConjunction result: 1048574. duration 114.0066ms
maxEvenConjunction2 result: 1048574 duration, 78.0044ms
max limina: 2097152
maxEvenDividing result: 2097150 duration
maxEvenDividing2 result: 2097150 duration
maxEvenConjunction result: 2097150. duration 112.0064ms
maxEvenConjunction2 result: 2097150 duration, 77.0044ms
max limina: 4194304
maxEvenDividing result: 4194302 duration
maxEvenDividing2 result: 4194302 duration
maxEvenConjunction result: 4194302. duration 111.0063ms
maxEvenConjunction2 result: 4194302 duration, 77.0044ms
max limina: 8388608
maxEvenDividing result: 8388606 duration
maxEvenDividing2 result: 8388606 duration
maxEvenConjunction result: 8388606. duration 114.0065ms
maxEvenConjunction2 result: 8388606 duration, 78.0045ms
max limina: 16777216
maxEvenDividing result: 16777214 duration
maxEvenDividing2 result: 16777214 duration
maxEvenConjunction result: 16777214. duration 109.0063ms
maxEvenConjunction2 result: 16777214 duration, 77.0044ms
max limina: 33554432
maxEvenDividing result: 33554430 duration
maxEvenDividing2 result: 33554430 duration
maxEvenConjunction result: 33554430. duration 110.0063ms
maxEvenConjunction2 result: 33554430 duration, 80.0045ms
max limina: 67108864
maxEvenDividing result: 67108860 duration
maxEvenDividing2 result: 67108860 duration
maxEvenConjunction result: 67108860. duration 112.0064ms
maxEvenConjunction2 result: 67108860 duration, 80.0046ms
max limina: 134217728
maxEvenDividing result: 134217726 duration
maxEvenDividing2 result: 134217726 duration
maxEvenConjunction result: 134217726. duration 114.0065ms
maxEvenConjunction2 result: 134217726 duration, 81.0047ms
max limina: 268435456
maxEvenDividing result: 268435446 duration
maxEvenDividing2 result: 268435446 duration
maxEvenConjunction result: 268435446. duration 114.0065ms
maxEvenConjunction2 result: 268435446 duration, 79.0045ms
max limina: 536870912
maxEvenDividing result: 536870910 duration
maxEvenDividing2 result: 536870910 duration
maxEvenConjunction result: 536870910. duration 109.0062ms
maxEvenConjunction2 result: 536870910 duration, 80.0046ms
Dilucidam explicationem invenire non potui cur Go compilator codicem non optimize et semper secundas condiciones inhibet, etiam si prima falsa est. Vel forte oculi mei tantum terrent et errorem aliquem manifestum non video? An debes aliqua specialia mandatorum compilator praebere? Libenter de sensibilibus comment.
PS: Ita, sicut ad ludum, similes probationes cucurri in Java 5 et in Java 7/8 - omnia plana sunt, tempus exsecutionis idem est.
Source: www.habr.com