๋ฃจํ ๋ด๋ถ์ ์กฐ๊ฑด์ ํ ์คํธํ๊ธฐ ์ํ ์ด ๋ ๊ฐ์ง ์ต์ ์ด ์ฑ๋ฅ ๋ฉด์์ ๋์ผํ๋ค๊ณ ์๊ฐํ์๋์?
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์์์ ๋ด ํ๋ก๊ทธ๋๋ฐ ๊ฒฝํ์ ๊ทธ๋ค์ง ๊ด๋ฒ์ํ์ง ์์ต๋๋ค. XNUMX๋ ๋ฐ์ด ์กฐ๊ธ ๋์๊ณ ์์ฃผ ์ฌ์ฉํ์ง๋ง ์์ ํ ์ค์ฉ์ ์ธ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํ์ต๋๋ค(์, ์๋ง๋ ๊ณ ๋ถํ 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 ์ปดํ์ผ๋ฌ๊ฐ ์ฝ๋๋ฅผ ์ต์ ํํ์ง ์๊ณ ์ฒซ ๋ฒ์งธ ์กฐ๊ฑด์ด false์ธ ๊ฒฝ์ฐ์๋ ํญ์ ๋ ๋ฒ์งธ ์กฐ๊ฑด์ ํ์ธํ๋ ์ด์ ์ ๋ํ ๋ช ํํ ์ค๋ช ์ ์ฐพ์ ์ ์์ต๋๋ค. ์๋๋ฉด ๋ด ๋์ด ํ๋ฆฟํด์ ๋๋ ทํ ์ค์๊ฐ ๋ณด์ด์ง ์๋ ๊ฑธ๊น์? ์๋๋ฉด ์ปดํ์ผ๋ฌ์ ํน๋ณํ ์ง์นจ์ ์ ๊ณตํด์ผ ํฉ๋๊น? ํฉ๋ฆฌ์ ์ธ ์๊ฒฌ์ ์ฃผ์๋ฉด ๊ธฐ์๊ฒ ์ต๋๋ค.
์ถ์ : ์, ์ฌ๋ฏธ์ผ์ Java 5์ Java 7/8์์ ์ ์ฌํ ํ ์คํธ๋ฅผ ์คํํ์ต๋๋ค. ๋ชจ๋ ๊ฒ์ด ๋ช ํํ๊ณ ์คํ ์๊ฐ๋ ๋์ผํฉ๋๋ค.
์ถ์ฒ : habr.com