Skip to content

Instantly share code, notes, and snippets.

@jnericks
Last active January 24, 2020 21:13
Show Gist options
  • Save jnericks/1640e0321353cb86646718bf939c9c3a to your computer and use it in GitHub Desktop.
Save jnericks/1640e0321353cb86646718bf939c9c3a to your computer and use it in GitHub Desktop.
package copyby_test
/*
$ go test -bench=. -benchmem ∞
goos: darwin
goarch: amd64
pkg: github.com/jnericks/copyby
BenchmarkCopyByStruct-12 1000000000 0.257 ns/op 0 B/op 0 allocs/op
BenchmarkCopyByStructNoInline-12 525012592 2.26 ns/op 0 B/op 0 allocs/op
BenchmarkCopyByPtr-12 1000000000 0.262 ns/op 0 B/op 0 allocs/op
BenchmarkCopyByPtrNoInline-12 700563824 1.72 ns/op 0 B/op 0 allocs/op
PASS
ok github.com/jnericks/copyby 3.720s
*/
import "testing"
var s = S{
Number: 99,
Text: "Ninety-Nine",
}
func BenchmarkCopyByStruct(b *testing.B) {
var d D
for i := 0; i < b.N; i++ {
d = byStruct(s)
}
if s.Number != d.Number {
b.Fail()
}
}
func BenchmarkCopyByStructNoInline(b *testing.B) {
var d D
for i := 0; i < b.N; i++ {
d = byStructNoInline(s)
}
if s.Number != d.Number {
b.Fail()
}
}
func BenchmarkCopyByPtr(b *testing.B) {
var d D
for i := 0; i < b.N; i++ {
d = byPtr(&s)
}
if s.Number != d.Number {
b.Fail()
}
}
func BenchmarkCopyByPtrNoInline(b *testing.B) {
var d D
for i := 0; i < b.N; i++ {
d = byPtrNoInline(&s)
}
if s.Number != d.Number {
b.Fail()
}
}
type S struct {
Number int
Text string
}
type D struct {
Text string
Number int
}
func byStruct(v S) D {
return D{
Number: v.Number,
Text: v.Text,
}
}
//go:noinline
func byStructNoInline(v S) D {
return D{
Number: v.Number,
Text: v.Text,
}
}
func byPtr(v *S) D {
return D{
Number: v.Number,
Text: v.Text,
}
}
//go:noinline
func byPtrNoInline(v *S) D {
return D{
Number: v.Number,
Text: v.Text,
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment