Skip to content

Instantly share code, notes, and snippets.

@c1982
Created December 29, 2021 13:35
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save c1982/a9f7d1f3518912599508352c0ceba0c4 to your computer and use it in GitHub Desktop.
Save c1982/a9f7d1f3518912599508352c0ceba0c4 to your computer and use it in GitHub Desktop.
DoD vs Std Struct
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
}
@mertakman
Copy link

mertakman commented Jan 3, 2022

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment