Vai, jÅ«suprÄt, Ŕīs divas iespÄjas cilpas apstÄkļu testÄÅ”anai ir lÄ«dzvÄrtÄ«gas veiktspÄjai?
if a > b && c*2 > d {
....
}
// Šø
if a <= b {
continue;
}
if c*2 > d {
....
}
Viss sÄkÄs ar āsmadzeÅu iesildÄ«Å”anuā; man bija jÄsniedz piemÄrs optimÄlai lielÄkÄ pÄra skaitļa meklÄÅ”anai veselu skaitļu masÄ«vÄ [-x....x]. Es domÄju, cik daudz labÄka veiktspÄja bÅ«tu, ja es izmantotu loÄ£isko reizinÄÅ”anu ar 1, lai noskaidrotu, vai skaitlis ir pÄra vai nÄ.
//Ń ŃŠµŃŠ½ŃŃ
ŃŠøŃŠµŠ» ŠæŠ¾ŃŠ»ŠµŠ“Š½ŠøŠ¹ Š±ŠøŃ Š²ŃŠµŠ³Š“Š° ŃŠ°Š²ŠµŠ½ 0
value & 1 == 0
//vs ŠŗŠ»Š°ŃŃŠøŃŠµŃŠŗŠøŠ¹ Š¼ŠµŃŠ¾Š“
value % 2 == 0
Mana programmÄÅ”anas pieredze Go nav Ä«paÅ”i plaÅ”a, tikai nedaudz vairÄk par pusotru gadu, es to izmantoju, lai gan bieži, bet tÄ«ri utilitÄriem nolÅ«kiem (nu, varbÅ«t izÅemot vienu projektu, kas saistÄ«ts ar augstas slodzes http servisu), tÄpÄc es sÄkÄs ar to. Atveriet GoLand un uzrakstiet vienkÄrÅ”u testu
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
}
IegÅ«stam rezultÄtu, kas parÄda, jo augstÄks slieksnis, jo biežÄk parÄdÄs veiktspÄjas svÄrstÄ«bas.
SalÄ«dzinÄtmax 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
Ir skaidrs, ka Å”ajÄ gadÄ«jumÄ dažÄdiem sliekÅ”Åiem mums ir dažÄdas testa datu kopas, procesora slodze (manÄ klÄpjdatorÄ i5-2540M) svÄrstÄs ap 20..30%, atmiÅa, ko aizÅem lietojumprogramma, kas darbojas no GoLand, ir vidÄji. apmÄram 813 MB - tas ietekmÄ arÄ« rezultÄta ticamÄ«bu, jums ir jÄsaglabÄ testa gadÄ«jumi diskÄ un jÄveic visi testi katram slieksnim atseviŔķi viens no otra.
Un tagad, domÄjot, kÄ to visu Ä«stenot ar minimÄlÄm izmaksÄm, automÄtiski laboju stÄvokļa pÄrbaudi
if value > current && value&1 == 0 {
current = value
}
par
if value <= current {
continue;
}
if value&1 == 0 {
current = value
}
Izpildu testus vÄlreiz... un vairs neko nesaprotu :)
Izpildei pavadÄ«tais laiks sÄk atŔķirties nevis par procentiem/procentu daļÄm, bet par 10..15%.Ätri pievienoju vÄl 2 testus:
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
}
Es to palaižu un iegÅ«stu Å”o attÄlu:sÄkotnÄjÄ masÄ«va ietilpÄ«ba: 100000000
maksimÄlais slieksnis: 128
maxEvenDividing rezultÄts: 126 ilgums 116.0066 ms
maxEvenDividing2 rezultÄts: 126 ilgums 79.0045 ms
maxEvenConjunction rezultÄts: 126 ilgums 114.0065 ms
maxEvenConjunction2 rezultÄts: 126 ilgums 83.0048 ms
maksimÄlais slieksnis: 256
maxEvenDividing rezultÄts: 254 ilgums 111.0063 ms
maxEvenDividing2 rezultÄts: 254 ilgums 77.0044 ms
maxEvenConjunction rezultÄts: 254 ilgums 110.0063 ms
maxEvenConjunction2 rezultÄts: 254 ilgums 80.0046 ms
maksimÄlais slieksnis: 512
maxEvenDividing rezultÄts: 510 ilgums 114.0066 ms
maxEvenDividing2 rezultÄts: 510 ilgums 80.0045 ms
maxEvenConjunction rezultÄts: 510 ilgums 110.0063 ms
maxEvenConjunction2 rezultÄts: 510 ilgums 80.0046 ms
maksimÄlais slieksnis: 1024
maxEvenDividing rezultÄts: 1022 ilgums 109.0063 ms
maxEvenDividing2 rezultÄts: 1022 ilgums 77.0044 ms
maxEvenConjunction rezultÄts: 1022 ilgums 111.0063 ms
maxEvenConjunction2 rezultÄts: 1022 ilgums 81.0047 ms
maksimÄlais slieksnis: 2048
maxEvenDividing rezultÄts: 2046 ilgums 114.0065 ms
maxEvenDividing2 rezultÄts: 2046 ilgums 79.0045 ms
maxEvenConjunction rezultÄts: 2046 ilgums 113.0065 ms
maxEvenConjunction2 rezultÄts: 2046 ilgums 81.0046 ms
maksimÄlais slieksnis: 4096
maxEvenDividing rezultÄts: 4094 ilgums 114.0065 ms
maxEvenDividing2 rezultÄts: 4094 ilgums 80.0046 ms
maxEvenConjunction rezultÄts: 4094 ilgums 111.0063 ms
maxEvenConjunction2 rezultÄts: 4094 ilgums 78.0045 ms
maksimÄlais slieksnis: 8192
maxEvenDividing rezultÄts: 8190 ilgums 107.0062 ms
maxEvenDividing2 rezultÄts: 8190 ilgums 77.0044 ms
maxEvenConjunction rezultÄts: 8190 ilgums 111.0063 ms
maxEvenConjunction2 rezultÄts: 8190 ilgums 77.0044 ms
maksimÄlais slieksnis: 16384
maxEvenDividing rezultÄts: 16382 ilgums 109.0063 ms
maxEvenDividing2 rezultÄts: 16382 ilgums 77.0044 ms
maxEvenConjunction rezultÄts: 16382 ilgums 108.0062 ms
maxEvenConjunction2 rezultÄts: 16382 ilgums 77.0044 ms
maksimÄlais slieksnis: 32768
maxEvenDividing rezultÄts: 32766 ilgums 112.0064 ms
maxEvenDividing2 rezultÄts: 32766 ilgums 77.0044 ms
maxEvenConjunction rezultÄts: 32766 ilgums 109.0062 ms
maxEvenConjunction2 rezultÄts: 32766 ilgums 78.0045 ms
maksimÄlais slieksnis: 65536
maxEvenDividing rezultÄts: 65534 ilgums 109.0062 ms
maxEvenDividing2 rezultÄts: 65534 ilgums 75.0043 ms
maxEvenConjunction rezultÄts: 65534 ilgums 109.0063 ms
maxEvenConjunction2 rezultÄts: 65534 ilgums 79.0045 ms
maksimÄlais slieksnis: 131072
maxEvenDividing rezultÄts: 131070 ilgums 108.0061 ms
maxEvenDividing2 rezultÄts: 131070 ilgums 76.0044 ms
maxEvenConjunction rezultÄts: 131070 ilgums 110.0063 ms
maxEvenConjunction2 rezultÄts: 131070 ilgums 80.0046 ms
maksimÄlais slieksnis: 262144
maxEvenDividing rezultÄts: 262142 ilgums 110.0063 ms
maxEvenDividing2 rezultÄts: 262142 ilgums 76.0044 ms
maxEvenConjunction rezultÄts: 262142 ilgums 107.0061 ms
maxEvenConjunction2 rezultÄts: 262142 ilgums 78.0044 ms
maksimÄlais slieksnis: 524288
maxEvenDividing rezultÄts: 524286 ilgums 109.0062 ms
maxEvenDividing2 rezultÄts: 524286 ilgums 78.0045 ms
maxEvenConjunction rezultÄts: 524286 ilgums 109.0062 ms
maxEvenConjunction2 rezultÄts: 524286 ilgums 80.0046 ms
maksimÄlais slieksnis: 1048576
maxEvenDividing rezultÄts: 1048574 ilgums 109.0063 ms
maxEvenDividing2 rezultÄts: 1048574 ilgums 80.0045 ms
maxEvenConjunction rezultÄts: 1048574 ilgums 114.0066 ms
maxEvenConjunction2 rezultÄts: 1048574 ilgums 78.0044 ms
maksimÄlais slieksnis: 2097152
maxEvenDividing rezultÄts: 2097150 ilgums 111.0064 ms
maxEvenDividing2 rezultÄts: 2097150 ilgums 79.0045 ms
maxEvenConjunction rezultÄts: 2097150 ilgums 112.0064 ms
maxEvenConjunction2 rezultÄts: 2097150 ilgums 77.0044 ms
maksimÄlais slieksnis: 4194304
maxEvenDividing rezultÄts: 4194302 ilgums 111.0063 ms
maxEvenDividing2 rezultÄts: 4194302 ilgums 78.0045 ms
maxEvenConjunction rezultÄts: 4194302 ilgums 111.0063 ms
maxEvenConjunction2 rezultÄts: 4194302 ilgums 77.0044 ms
maksimÄlais slieksnis: 8388608
maxEvenDividing rezultÄts: 8388606 ilgums 109.0062 ms
maxEvenDividing2 rezultÄts: 8388606 ilgums 78.0045 ms
maxEvenConjunction rezultÄts: 8388606 ilgums 114.0065 ms
maxEvenConjunction2 rezultÄts: 8388606 ilgums 78.0045 ms
maksimÄlais slieksnis: 16777216
maxEvenDividing rezultÄts: 16777214 ilgums 109.0062 ms
maxEvenDividing2 rezultÄts: 16777214 ilgums 77.0044 ms
maxEvenConjunction rezultÄts: 16777214 ilgums 109.0063 ms
maxEvenConjunction2 rezultÄts: 16777214 ilgums 77.0044 ms
maksimÄlais slieksnis: 33554432
maxEvenDividing rezultÄts: 33554430 ilgums 113.0065 ms
maxEvenDividing2 rezultÄts: 33554430 ilgums 78.0045 ms
maxEvenConjunction rezultÄts: 33554430 ilgums 110.0063 ms
maxEvenConjunction2 rezultÄts: 33554430 ilgums 80.0045 ms
maksimÄlais slieksnis: 67108864
maxEvenDividing rezultÄts: 67108860 ilgums 112.0064 ms
maxEvenDividing2 rezultÄts: 67108860 ilgums 77.0044 ms
maxEvenConjunction rezultÄts: 67108860 ilgums 112.0064 ms
maxEvenConjunction2 rezultÄts: 67108860 ilgums 80.0046 ms
maksimÄlais slieksnis: 134217728
maxEvenDividing rezultÄts: 134217726 ilgums 109.0063 ms
maxEvenDividing2 rezultÄts: 134217726 ilgums 78.0044 ms
maxEvenConjunction rezultÄts: 134217726 ilgums 114.0065 ms
maxEvenConjunction2 rezultÄts: 134217726 ilgums 81.0047 ms
maksimÄlais slieksnis: 268435456
maxEvenDividing rezultÄts: 268435446 ilgums 111.0064 ms
maxEvenDividing2 rezultÄts: 268435446 ilgums 79.0045 ms
maxEvenConjunction rezultÄts: 268435446 ilgums 114.0065 ms
maxEvenConjunction2 rezultÄts: 268435446 ilgums 79.0045 ms
maksimÄlais slieksnis: 536870912
maxEvenDividing rezultÄts: 536870910 ilgums 107.0062 ms
maxEvenDividing2 rezultÄts: 536870910 ilgums 76.0043 ms
maxEvenConjunction rezultÄts: 536870910 ilgums 109.0062 ms
maxEvenConjunction2 rezultÄts: 536870910 ilgums 80.0046 ms
Es nevarÄju atrast skaidru skaidrojumu, kÄpÄc Go kompilators neoptimizÄ kodu un vienmÄr pÄrbauda otro nosacÄ«jumu, pat ja pirmais ir nepatiess. Vai varbÅ«t manas acis ir vienkÄrÅ”i izplÅ«duÅ”as un es neredzu nekÄdu acÄ«mredzamu kļūdu? Vai arÄ« jums ir jÄsniedz daži Ä«paÅ”i norÄdÄ«jumi kompilatoram? PriecÄÅ”os par saprÄtÄ«giem komentÄriem.
PS: JÄ, sava prieka pÄc, es veica lÄ«dzÄ«gus testus uz Java 5 un Java 7/8 - viss skaidrs, izpildes laiks ir vienÄds.
Avots: www.habr.com