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 }