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
}
@c1982
Copy link
Author

c1982 commented Dec 29, 2021


goos: darwin
goarch: amd64
pkg: micop
cpu: Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz
BenchmarkPlayerStd
BenchmarkPlayerStd-16          	   22785	     48868 ns/op	     463 B/op	       0 allocs/op
BenchmarkPlayerDoD
BenchmarkPlayerDoD-16          	  342056	      3760 ns/op	       3 B/op	       0 allocs/op
BenchmarkSearchPlayerStd
BenchmarkSearchPlayerStd-16    	   18788	     59293 ns/op	     562 B/op	       0 allocs/op
BenchmarkSeachPlayerDoD
BenchmarkSeachPlayerDoD-16     	  956738	      1283 ns/op	       1 B/op	       0 allocs/op
PASS
ok  	micop	6.819s

@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