github.com/xushiwei/go@v0.0.0-20130601165731-2b9d83f45bc9/src/pkg/runtime/mfinal_test.go (about)

     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  
     5  package runtime_test
     6  
     7  import (
     8  	"runtime"
     9  	"sync"
    10  	"sync/atomic"
    11  	"testing"
    12  )
    13  
    14  func fin(v *int) {
    15  }
    16  
    17  func 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  
    44  func 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  }