github.com/tiandiyijian/rwLock@v0.0.0-20220310124752-bd6035a0dde8/benchmarkRwLock_test.go (about)

     1  package rwlock
     2  
     3  import (
     4  	"sync"
     5  	"testing"
     6  )
     7  
     8  var cs1 = 0 // 模拟临界区要保护的数据
     9  var mu1 sync.Mutex
    10  
    11  var cs2 = 0 // 模拟临界区要保护的数据
    12  var mu2 sync.RWMutex
    13  
    14  var cs3 = 0
    15  var mu3 FairRwLock
    16  
    17  var cs4 = 0
    18  var mu4 ReaderFirstRwLock
    19  
    20  var cs5 = 0
    21  var mu5 WriterFirstRwLock
    22  
    23  func BenchmarkWriteSyncByMutex(b *testing.B) {
    24  	b.RunParallel(func(pb *testing.PB) {
    25  		for pb.Next() {
    26  			mu1.Lock()
    27  			cs1++
    28  			mu1.Unlock()
    29  		}
    30  	})
    31  }
    32  
    33  func BenchmarkReadSyncByMutex(b *testing.B) {
    34  	b.RunParallel(func(pb *testing.PB) {
    35  		for pb.Next() {
    36  			mu1.Lock()
    37  			_ = cs1
    38  			mu1.Unlock()
    39  		}
    40  	})
    41  }
    42  
    43  func BenchmarkReadSyncByRWMutex(b *testing.B) {
    44  	b.RunParallel(func(pb *testing.PB) {
    45  		for pb.Next() {
    46  			mu2.RLock()
    47  			_ = cs2
    48  			mu2.RUnlock()
    49  		}
    50  	})
    51  }
    52  
    53  func BenchmarkWriteSyncByRWMutex(b *testing.B) {
    54  	b.RunParallel(func(pb *testing.PB) {
    55  		for pb.Next() {
    56  			mu2.Lock()
    57  			cs2++
    58  			mu2.Unlock()
    59  		}
    60  	})
    61  }
    62  
    63  func BenchmarkWriteSyncByFairRWMutex(b *testing.B) {
    64  	b.RunParallel(func(pb *testing.PB) {
    65  		for pb.Next() {
    66  			mu3.Lock()
    67  			cs3++
    68  			mu3.Unlock()
    69  		}
    70  	})
    71  }
    72  
    73  func BenchmarkReadSyncByFairRWMutex(b *testing.B) {
    74  	b.RunParallel(func(pb *testing.PB) {
    75  		for pb.Next() {
    76  			mu3.RLock()
    77  			_ = cs3
    78  			mu3.RUnlock()
    79  		}
    80  	})
    81  }
    82  
    83  func BenchmarkSyncByRWMutex(b *testing.B) {
    84  
    85  	for i := 0; i < 100000; i++ {
    86  		go func() {
    87  			mu2.Lock()
    88  			cs2++
    89  			mu2.Unlock()
    90  		}()
    91  	}
    92  
    93  	for i := 0; i < 1000000; i++ {
    94  		go func() {
    95  			mu2.RLock()
    96  			_ = cs2
    97  			mu2.RUnlock()
    98  		}()
    99  	}
   100  	// fmt.Println(cs3)
   101  }
   102  
   103  func BenchmarkSyncByFairRWMutex(b *testing.B) {
   104  
   105  	for i := 0; i < 100000; i++ {
   106  		go func() {
   107  			mu3.Lock()
   108  			cs3++
   109  			mu3.Unlock()
   110  		}()
   111  	}
   112  
   113  	for i := 0; i < 1000000; i++ {
   114  		go func() {
   115  			mu3.RLock()
   116  			_ = cs3
   117  			mu3.RUnlock()
   118  		}()
   119  	}
   120  	// fmt.Println(cs3)
   121  }
   122  
   123  func BenchmarkSyncByReaderFirstRWMutex(b *testing.B) {
   124  	for i := 0; i < 100000; i++ {
   125  		go func() {
   126  			mu4.Lock()
   127  			cs4++
   128  			mu4.Unlock()
   129  		}()
   130  	}
   131  
   132  	for i := 0; i < 1000000; i++ {
   133  		go func() {
   134  			mu4.RLock()
   135  			_ = cs4
   136  			mu4.RUnlock()
   137  		}()
   138  	}
   139  	// fmt.Println(cs3)
   140  }
   141  
   142  func BenchmarkSyncByWriterFirstRWMutex(b *testing.B) {
   143  	for i := 0; i < 100000; i++ {
   144  		go func() {
   145  			mu5.Lock()
   146  			cs5++
   147  			mu5.Unlock()
   148  		}()
   149  	}
   150  
   151  	for i := 0; i < 1000000; i++ {
   152  		go func() {
   153  			mu5.RLock()
   154  			_ = cs5
   155  			mu5.RUnlock()
   156  		}()
   157  	}
   158  	// fmt.Println(cs3)
   159  }