]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: add simple malloc benchmarks
authorDmitriy Vyukov <dvyukov@google.com>
Wed, 15 May 2013 17:22:32 +0000 (21:22 +0400)
committerDmitriy Vyukov <dvyukov@google.com>
Wed, 15 May 2013 17:22:32 +0000 (21:22 +0400)
Allocs of size 16 can bypass atomic set of the allocated bit, while allocs of size 8 can not.
Allocs with and w/o type info hit different paths inside of malloc.
Current results on linux/amd64:
BenchmarkMalloc8 50000000         43.6 ns/op
BenchmarkMalloc16 50000000         46.7 ns/op
BenchmarkMallocTypeInfo8 50000000         61.3 ns/op
BenchmarkMallocTypeInfo16 50000000         63.5 ns/op

R=golang-dev, remyoudompheng, minux.ma, bradfitz, iant
CC=golang-dev
https://golang.org/cl/9090045

src/pkg/runtime/malloc_test.go [new file with mode: 0644]

diff --git a/src/pkg/runtime/malloc_test.go b/src/pkg/runtime/malloc_test.go
new file mode 100644 (file)
index 0000000..1afd32d
--- /dev/null
@@ -0,0 +1,52 @@
+// Copyright 2013 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package runtime_test
+
+import (
+       "testing"
+       "unsafe"
+)
+
+var mallocSink uintptr
+
+func BenchmarkMalloc8(b *testing.B) {
+       var x uintptr
+       for i := 0; i < b.N; i++ {
+               p := new(int64)
+               x ^= uintptr(unsafe.Pointer(p))
+       }
+       mallocSink = x
+}
+
+func BenchmarkMalloc16(b *testing.B) {
+       var x uintptr
+       for i := 0; i < b.N; i++ {
+               p := new([2]int64)
+               x ^= uintptr(unsafe.Pointer(p))
+       }
+       mallocSink = x
+}
+
+func BenchmarkMallocTypeInfo8(b *testing.B) {
+       var x uintptr
+       for i := 0; i < b.N; i++ {
+               p := new(struct {
+                       p [8 / unsafe.Sizeof(uintptr(0))]*int
+               })
+               x ^= uintptr(unsafe.Pointer(p))
+       }
+       mallocSink = x
+}
+
+func BenchmarkMallocTypeInfo16(b *testing.B) {
+       var x uintptr
+       for i := 0; i < b.N; i++ {
+               p := new(struct {
+                       p [16 / unsafe.Sizeof(uintptr(0))]*int
+               })
+               x ^= uintptr(unsafe.Pointer(p))
+       }
+       mallocSink = x
+}