Created
December 29, 2021 13:35
-
-
Save c1982/a9f7d1f3518912599508352c0ceba0c4 to your computer and use it in GitHub Desktop.
DoD vs Std Struct
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"math/rand" | |
"testing" | |
) | |
type Player struct { | |
ID int | |
health int | |
mana int | |
maxHealth int | |
minHealth int | |
maxMana int | |
minMana int | |
junkData1 int | |
junkData2 int | |
junkData3 int | |
junkData4 int | |
junkData5 int | |
junkData6 int | |
junkData7 int | |
junkData8 int | |
junkData9 int | |
} | |
type DoDPlayer struct { | |
IDs []int | |
healths []int | |
manas []int | |
maxHealths []int | |
minHealths []int | |
maxManas []int | |
minManas []int | |
junkDatas1 []int | |
junkDatas2 []int | |
junkDatas3 []int | |
junkDatas4 []int | |
junkDatas5 []int | |
junkDatas6 []int | |
junkDatas7 []int | |
junkDatas8 []int | |
junkDatas9 []int | |
} | |
func BenchmarkPlayerStd(b *testing.B) { | |
players := generatePlayers() | |
for n := 0; n < b.N; n++ { | |
for i := 0; i < len(players); i++ { | |
players[i].mana = players[i].mana + 1 | |
} | |
} | |
} | |
func BenchmarkPlayerDoD(b *testing.B) { | |
dodplayer := generateDoDPlayers() | |
manas := dodplayer.manas | |
for n := 0; n < b.N; n++ { | |
for i := 0; i < len(manas); i++ { | |
manas[i] = manas[i] + 1 | |
} | |
} | |
} | |
func BenchmarkSearchPlayerStd(b *testing.B) { | |
players := generatePlayers() | |
for n := 0; n < b.N; n++ { | |
for _, p := range players { | |
if p.ID == 5000 { | |
break | |
} | |
} | |
} | |
} | |
func BenchmarkSeachPlayerDoD(b *testing.B) { | |
player := generateDoDPlayers() | |
for n := 0; n < b.N; n++ { | |
for _, p := range player.IDs { | |
if p == 5000 { | |
break | |
} | |
} | |
} | |
} | |
func generatePlayers() []Player { | |
rnd := rand.New(rand.NewSource(64)) | |
size := 10000 | |
players := make([]Player, size) | |
for i := 0; i < size; i++ { | |
players = append(players, Player{ID: i, mana: rnd.Intn(1000)}) | |
} | |
return players | |
} | |
func generateDoDPlayers() DoDPlayer { | |
rnd := rand.New(rand.NewSource(64)) | |
size := 10000 | |
player := DoDPlayer{ | |
IDs: make([]int, size), | |
healths: make([]int, size), | |
manas: make([]int, size), | |
maxHealths: make([]int, size), | |
minHealths: make([]int, size), | |
maxManas: make([]int, size), | |
minManas: make([]int, size), | |
junkDatas1: make([]int, size), | |
junkDatas2: make([]int, size), | |
junkDatas3: make([]int, size), | |
junkDatas4: make([]int, size), | |
junkDatas5: make([]int, size), | |
junkDatas6: make([]int, size), | |
junkDatas7: make([]int, size), | |
junkDatas8: make([]int, size), | |
junkDatas9: make([]int, size), | |
} | |
for i := 0; i < size; i++ { | |
player.IDs[i] = i | |
player.manas[i] = rnd.Intn(1000) | |
} | |
return player | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Benchmark adaletsiz olmus , generateplayers length'iyle initialize edildiginden cikti slice inin lengthi 20.000 . Birde 3'den fazla field a erisim yapilinca std'a gore kasiyor :l
BenchmarkPlayerStd-12 42963 26838 ns/op 30 B/op 0 allocs/op
BenchmarkPlayerDoD-12 286344 4186 ns/op 4 B/op 0 allocs/op
BenchmarkSearchPlayerStd-12 146473 7930 ns/op 8 B/op 0 allocs/op
BenchmarkSeachPlayerDoD-12 455161 2388 ns/op 2 B/op 0 allocs/op
https://go.dev/play/p/yGCoaOp-vzn