Golang Go语言中为啥读写锁和互斥锁效率没看出来差别啊

发布于 1周前 作者 vueper 来自 Go语言

Golang Go语言中为啥读写锁和互斥锁效率没看出来差别啊

package main`

import ( “sync” “testing” “time” )

const ( cost = 10 * time.Microsecond )

type RW interface { Write() Read() }

type Lock struct { count int mu sync.Mutex }

func (l *Lock) Read() { l.mu.Lock() time.Sleep(cost) _ = l.count l.mu.Unlock() }

func (l *Lock) Write() { l.mu.Lock() l.count++ time.Sleep(cost) l.mu.Unlock() }

type RWLock struct { count int mu sync.RWMutex }

func (r *RWLock) Read() { r.mu.Lock() time.Sleep(cost) _ = r.count r.mu.Unlock() }

func (r *RWLock) Write() { r.mu.Lock() r.count++ time.Sleep(cost) r.mu.Unlock() }

func benchmark(b *testing.B, rw RW, read, write int) {

for i := 0; i < b.N; i++ {
	var wg sync.WaitGroup
	for k := 0; k < read*100; k++ {
		wg.Add(1)
		go func() {
			rw.Read()
			wg.Done()
		}()
	}

	for m := 0; m < write*100; m++ {
		wg.Add(1)
		go func() {
			rw.Write()
			wg.Done()
		}()
	}
	wg.Wait()
}

}

func BenchmarkReadMore(b *testing.B) { benchmark(b, &Lock{}, 9, 1) }

func BenchmarkReadMoreRW(b *testing.B) { benchmark(b, &RWLock{}, 9, 1) }

func BenchmarkWriteMore(b *testing.B) { benchmark(b, &Lock{}, 1, 9) }

func BenchmarkWriteMoreRW(b *testing.B) { benchmark(b, &RWLock{}, 1, 9) }

func BenchmarkReadEqual(b *testing.B) { benchmark(b, &Lock{}, 5, 5) }

func BenchmarkReadEqualRW(b *testing.B) { benchmark(b, &RWLock{}, 5, 5) }

下面这是我的执行结果:

goarch: amd64
pkg: test
cpu: Intel(R) Core(TM) i5-8257U CPU @ 1.40GHz
|BenchmarkReadMore-8| 62| 18909825| ns/op|
|BenchmarkReadMoreRW-8 | 63| 18825713 |ns/op | |BenchmarkWriteMore-8 | 63 | 18774136| ns/op | |BenchmarkWriteMoreRW-8 | 63 | 20889956 ns/op | PASS
ok test 5.407s


更多关于Golang Go语言中为啥读写锁和互斥锁效率没看出来差别啊的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

RLock, RUnlock

更多关于Golang Go语言中为啥读写锁和互斥锁效率没看出来差别啊的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你加的全是写锁,没有读锁

感谢感谢~

在Golang中,读写锁(RWMutex)和互斥锁(Mutex)的设计初衷是为了解决不同的并发访问场景,理论上它们在效率上应该有所区别。如果在实际应用中感觉两者的效率差别不明显,可能有以下几种原因:

  1. 访问模式:如果读操作远多于写操作,读写锁应该表现出更高的效率。但如果写操作频繁,读写锁在获取写锁时需要等待所有读锁释放,这会降低其优势。如果读写操作比例接近,两者效率可能相近。

  2. 锁竞争程度:在低并发环境下,锁竞争不激烈,两种锁的开销都较小,效率差异不明显。在高并发且锁竞争激烈的情况下,差异可能更显著。

  3. 锁实现细节:Golang的锁实现经过高度优化,对于小规模的并发访问,优化后的Mutex可能已经足够高效,使得读写锁的优势不明显。

  4. 测试方法:测试方法是否科学、合理也会影响结果。确保测试代码准确模拟了实际使用场景,并充分运行以消除偶然性。

  5. 硬件和系统环境:不同的硬件架构和操作系统对锁的实现和性能也有影响。

综上,读写锁和互斥锁的效率差异取决于具体的使用场景和并发模式。在设计和测试时,建议深入分析应用需求,选择最合适的锁机制。如果仍然有疑问,可以通过性能分析工具(如pprof)来进一步分析锁的使用情况和性能瓶颈。

回到顶部