blob: de632717a57390a303e621dc789942c494b401e9 [file] [log] [blame]
Dmitriy Vyukovc14b2682011-10-06 18:42:51 +03001// Copyright 2011 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package runtime_test
6
7import (
8 "runtime"
9 "sync"
10 "sync/atomic"
11 "testing"
12)
13
14func fin(v *int) {
15}
16
17func BenchmarkFinalizer(b *testing.B) {
18 const CallsPerSched = 1000
19 procs := runtime.GOMAXPROCS(-1)
20 N := int32(b.N / CallsPerSched)
21 var wg sync.WaitGroup
22 wg.Add(procs)
23 for p := 0; p < procs; p++ {
24 go func() {
25 var data [CallsPerSched]*int
26 for i := 0; i < CallsPerSched; i++ {
27 data[i] = new(int)
28 }
29 for atomic.AddInt32(&N, -1) >= 0 {
30 runtime.Gosched()
31 for i := 0; i < CallsPerSched; i++ {
32 runtime.SetFinalizer(data[i], fin)
33 }
34 for i := 0; i < CallsPerSched; i++ {
35 runtime.SetFinalizer(data[i], nil)
36 }
37 }
38 wg.Done()
39 }()
40 }
41 wg.Wait()
42}
43
44func BenchmarkFinalizerRun(b *testing.B) {
45 const CallsPerSched = 1000
46 procs := runtime.GOMAXPROCS(-1)
47 N := int32(b.N / CallsPerSched)
48 var wg sync.WaitGroup
49 wg.Add(procs)
50 for p := 0; p < procs; p++ {
51 go func() {
52 for atomic.AddInt32(&N, -1) >= 0 {
53 runtime.Gosched()
54 for i := 0; i < CallsPerSched; i++ {
55 v := new(int)
56 runtime.SetFinalizer(v, fin)
57 }
58 runtime.GC()
59 }
60 wg.Done()
61 }()
62 }
63 wg.Wait()
64}