1// 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} 65