github.com/influx6/npkg@v0.8.8/natomic/natomic_test.go (about)

     1  package natomic
     2  
     3  import (
     4  	"sync"
     5  	"sync/atomic"
     6  	"testing"
     7  )
     8  
     9  func TestAtomicCounter(t *testing.T) {
    10  	var ws IntCounter
    11  	var waiter sync.WaitGroup
    12  	for i := 0; i < 100; i++ {
    13  		waiter.Add(1)
    14  		go func() {
    15  			defer waiter.Done()
    16  			for i := 0; i < 1000; i++ {
    17  				ws.Add(i)
    18  			}
    19  		}()
    20  
    21  		waiter.Add(1)
    22  		go func() {
    23  			defer waiter.Done()
    24  			for i := 0; i < 1000; i++ {
    25  				ws.Read()
    26  			}
    27  		}()
    28  	}
    29  
    30  	for i := 0; i < 1000; i++ {
    31  		ws.Read()
    32  	}
    33  
    34  	waiter.Wait()
    35  }
    36  
    37  func BenchmarkIntSwitchWrite(b *testing.B) {
    38  	b.ResetTimer()
    39  	b.ReportAllocs()
    40  
    41  	var ws IntSwitch
    42  	for i := 0; i < b.N; i++ {
    43  		ws.Flip(i)
    44  	}
    45  }
    46  
    47  func BenchmarkAtomicCounter(b *testing.B) {
    48  	b.ResetTimer()
    49  	b.ReportAllocs()
    50  
    51  	var ws IntCounter
    52  	var waiter sync.WaitGroup
    53  	for i := 0; i < 100; i++ {
    54  		waiter.Add(1)
    55  		go func() {
    56  			defer waiter.Done()
    57  			for i := 0; i < 1000; i++ {
    58  				ws.Add(i)
    59  			}
    60  		}()
    61  
    62  		waiter.Add(1)
    63  		go func() {
    64  			defer waiter.Done()
    65  			for i := 0; i < 1000; i++ {
    66  				ws.Read()
    67  			}
    68  		}()
    69  	}
    70  
    71  	for i := 0; i < 1000; i++ {
    72  		ws.Read()
    73  	}
    74  
    75  	waiter.Wait()
    76  }
    77  
    78  func BenchmarkAtomicInt(b *testing.B) {
    79  	b.ResetTimer()
    80  	b.ReportAllocs()
    81  
    82  	var ws int64
    83  	var waiter sync.WaitGroup
    84  	for i := 0; i < 100; i++ {
    85  		waiter.Add(1)
    86  		go func() {
    87  			defer waiter.Done()
    88  			for i := 0; i < 1000; i++ {
    89  				atomic.AddInt64(&ws, 1)
    90  			}
    91  		}()
    92  	}
    93  
    94  	for i := 0; i < 100; i++ {
    95  		waiter.Add(1)
    96  		go func() {
    97  			defer waiter.Done()
    98  			for i := 0; i < 1000; i++ {
    99  				atomic.LoadInt64(&ws)
   100  			}
   101  		}()
   102  	}
   103  
   104  	for i := 0; i < 1000; i++ {
   105  		atomic.LoadInt64(&ws)
   106  	}
   107  
   108  	waiter.Wait()
   109  }
   110  
   111  func BenchmarkUintSwitchWrite(b *testing.B) {
   112  	b.ResetTimer()
   113  	b.ReportAllocs()
   114  
   115  	var ws UintSwitch
   116  	for i := 0; i < b.N; i++ {
   117  		ws.Flip(uint(i))
   118  	}
   119  }
   120  
   121  func BenchmarkBoolSwitchWrite(b *testing.B) {
   122  	b.ResetTimer()
   123  	b.ReportAllocs()
   124  
   125  	var ws BoolSwitch
   126  	for i := 0; i < b.N; i++ {
   127  		ws.Flip(true)
   128  	}
   129  }
   130  
   131  func BenchmarkIntSwitchRead(b *testing.B) {
   132  	b.ResetTimer()
   133  	b.ReportAllocs()
   134  
   135  	var ws IntSwitch
   136  	ws.Flip(1)
   137  	for i := 0; i < b.N; i++ {
   138  		ws.Read()
   139  	}
   140  }
   141  
   142  func BenchmarkUintSwitchRead(b *testing.B) {
   143  	b.ResetTimer()
   144  	b.ReportAllocs()
   145  
   146  	var ws UintSwitch
   147  	ws.Flip(1)
   148  	for i := 0; i < b.N; i++ {
   149  		ws.Read()
   150  	}
   151  }
   152  
   153  func BenchmarkBoolSwitchRead(b *testing.B) {
   154  	b.ResetTimer()
   155  	b.ReportAllocs()
   156  
   157  	var ws BoolSwitch
   158  	ws.Flip(true)
   159  	for i := 0; i < b.N; i++ {
   160  		ws.Read()
   161  	}
   162  }
   163  
   164  func BenchmarkAtomWrite(b *testing.B) {
   165  	b.ResetTimer()
   166  	b.ReportAllocs()
   167  
   168  	var ws = NewAtom(nil)
   169  	ws.Set(1)
   170  
   171  	for i := 0; i < b.N; i++ {
   172  		ws.Set(i)
   173  	}
   174  }
   175  
   176  func BenchmarkAtomRead(b *testing.B) {
   177  	b.ResetTimer()
   178  	b.ReportAllocs()
   179  
   180  	var ws = NewAtom(nil)
   181  	ws.Set(1)
   182  	for i := 0; i < b.N; i++ {
   183  		ws.Read()
   184  	}
   185  }