github.com/andy2046/gopie@v0.7.0/pkg/spsc/spsc_test.go (about)

     1  package spsc_test
     2  
     3  import (
     4  	. "github.com/andy2046/gopie/pkg/spsc"
     5  	"runtime"
     6  	"sync"
     7  	"testing"
     8  	"time"
     9  )
    10  
    11  func BenchmarkSPSC_NonBlocking(b *testing.B) {
    12  	var sp = New(8192)
    13  	var wg sync.WaitGroup
    14  	wg.Add(2)
    15  	type T struct {
    16  		i int
    17  	}
    18  	var v = T{5}
    19  	b.ResetTimer()
    20  	go func(n int) {
    21  		runtime.LockOSThread()
    22  		for i := 0; i < n; i++ {
    23  			for !sp.Offer(&v) {
    24  				runtime.Gosched()
    25  			}
    26  		}
    27  		wg.Done()
    28  	}(b.N)
    29  
    30  	go func(n int) {
    31  		runtime.LockOSThread()
    32  		var v *T
    33  		for i := 0; i < n; i++ {
    34  			for !sp.Poll(&v) {
    35  				runtime.Gosched()
    36  			}
    37  			_ = *v
    38  		}
    39  		wg.Done()
    40  	}(b.N)
    41  
    42  	wg.Wait()
    43  }
    44  
    45  func BenchmarkSPSC_NonBlocking2(b *testing.B) {
    46  	var sp = New(8192)
    47  	var wg sync.WaitGroup
    48  	wg.Add(2)
    49  	type T struct {
    50  		i int
    51  	}
    52  	p := runtime.GOMAXPROCS(1)
    53  	var v = T{5}
    54  	b.ResetTimer()
    55  	go func(n int) {
    56  		for i := 0; i < n; i++ {
    57  			for !sp.Offer(&v) {
    58  				runtime.Gosched()
    59  			}
    60  		}
    61  		wg.Done()
    62  	}(b.N)
    63  
    64  	go func(n int) {
    65  		var v *T
    66  		for i := 0; i < n; i++ {
    67  			for !sp.Poll(&v) {
    68  				runtime.Gosched()
    69  			}
    70  			_ = *v
    71  		}
    72  		wg.Done()
    73  	}(b.N)
    74  
    75  	wg.Wait()
    76  	runtime.GOMAXPROCS(p)
    77  }
    78  
    79  func BenchmarkSPSC_Blocking(b *testing.B) {
    80  	var sp = New(8192)
    81  	var wg sync.WaitGroup
    82  	wg.Add(2)
    83  	type T struct {
    84  		i int
    85  	}
    86  	var v = T{5}
    87  	b.ResetTimer()
    88  	go func(n int) {
    89  		runtime.LockOSThread()
    90  		for i := 0; i < n; i++ {
    91  			sp.Put(&v)
    92  		}
    93  		sp.Close()
    94  		wg.Done()
    95  	}(b.N)
    96  
    97  	go func(n int) {
    98  		runtime.LockOSThread()
    99  		var v *T
   100  		for i := 0; sp.Get(&v); i++ {
   101  			_ = *v
   102  		}
   103  		wg.Done()
   104  	}(b.N)
   105  
   106  	wg.Wait()
   107  }
   108  
   109  func BenchmarkSPSC_Blocking2(b *testing.B) {
   110  	var sp = New(8192)
   111  	var wg sync.WaitGroup
   112  	wg.Add(2)
   113  	type T struct {
   114  		i int
   115  	}
   116  	p := runtime.GOMAXPROCS(1)
   117  	var v = T{5}
   118  	b.ResetTimer()
   119  	go func(n int) {
   120  		for i := 0; i < b.N; i++ {
   121  			sp.Put(&v)
   122  		}
   123  		sp.Close()
   124  		wg.Done()
   125  	}(b.N)
   126  
   127  	go func(n int) {
   128  		var v *T
   129  		for i := 0; sp.Get(&v); i++ {
   130  			_ = *v
   131  		}
   132  		wg.Done()
   133  	}(b.N)
   134  
   135  	wg.Wait()
   136  	runtime.GOMAXPROCS(p)
   137  }
   138  
   139  func TestSPSC_NonBlocking(t *testing.T) {
   140  	const N = 1000
   141  	var sp = New(4)
   142  	var wg sync.WaitGroup
   143  	wg.Add(2)
   144  	t1 := time.Now()
   145  	go func(n int) {
   146  		defer wg.Done()
   147  		for i := 0; i < n; i++ {
   148  			for !sp.Offer(int64(i)) {
   149  				runtime.Gosched()
   150  			}
   151  			time.Sleep(1 * time.Microsecond)
   152  		}
   153  	}(N)
   154  	go func(n int) {
   155  		defer wg.Done()
   156  		var v *int
   157  		for i := 0; i < n; i++ {
   158  			for !sp.Poll(&v) {
   159  				runtime.Gosched()
   160  			}
   161  			if i != *v {
   162  				t.Fatalf("Expected %d, but got %d", i, *v)
   163  				panic(i)
   164  			}
   165  		}
   166  	}(N)
   167  	wg.Wait()
   168  	t.Log(time.Since(t1))
   169  }
   170  
   171  func TestSPSC_Blocking(t *testing.T) {
   172  	const N = 1000
   173  	var sp = New(4)
   174  	var wg sync.WaitGroup
   175  	wg.Add(2)
   176  	t1 := time.Now()
   177  	go func(n int) {
   178  		defer wg.Done()
   179  		for i := 0; i < n; i++ {
   180  			sp.Put(int64(i))
   181  			time.Sleep(1 * time.Microsecond)
   182  		}
   183  		sp.Close()
   184  	}(N)
   185  	go func(n int) {
   186  		defer wg.Done()
   187  		var v *int
   188  		for i := 0; sp.Get(&v); i++ {
   189  			if i != *v {
   190  				t.Fatalf("Expected %d, but got %d", i, *v)
   191  				panic(i)
   192  			}
   193  		}
   194  	}(N)
   195  	wg.Wait()
   196  	t.Log(time.Since(t1))
   197  }