亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

`sync.Mutex`、`sync.Map` 和 `atomic.Value` 的效率比較

`sync.Mutex`、`sync.Map` 和 `atomic.Value` 的效率比較

Go
回首憶惘然 2022-11-23 20:25:41
當我比較sync.mu,sync.Map和atomic.Valuego 的效率時,預計它sync.mu的效率低于后兩者。但是當我做一個基準測試時,發現使用sync.mu. 所以我想知道原因或者可能有最佳實踐。代碼源代碼在這里https://go.dev/play/p/WODF8Tyyw4d簡化如下:Scene1:在map中改變一個隨機的kv對,sync.muvssync.Map// sync.mu readermu.Lock()tmp := tA[idx]mu.Unlock()// sync.mu writermu.Lock()tA[idx] = datamu.Unlock()// sync.Map readerv, _ := tB.Load(idx)// sync.Map writertB.Store(idx, data)Scene2:換一整張圖,sync.muvsatomic.Value// sync.mu readermu.Lock()tmp := tA[0]mu.Unlock()// sync.mu Writermu.Lock()tA = datamu.Unlock()// atomic.Value readerv := tC.Load().(map[int]int)[0]// atomic.Value writertC.Store(data)結果goos: darwingoarch: amd64pkg: sync-democpu: Intel(R) Core(TM) i7-9750H CPU @ 2.60GHzBenchmarkMu-12          1000000000               0.5401 ns/opBenchmarkSyncMap-12     1000000000               0.5504 ns/opBenchmarkMuTotal-12     1000000000               0.5418 ns/opBenchmarkAtomic-12      1000000000               0.5457 ns/opPASSok      sync-demo    64.195s
查看完整描述

1 回答

?
慕蓋茨4494581

TA貢獻1850條經驗 獲得超11個贊

你沒有比較這種同步結構的效率,因為你也在做 I/0。這段代碼中還有 goroutines 和 waitgroups ……不確定我是否理解

您應該考慮比較相同上下文中的相似用法。

例如,增加一個計數器。您在 sync.Map 中有一個計數器,atomic.Value 并受互斥鎖保護。

每種方法都各有利弊,但互斥體只處理同步,而其他結構也處理存儲。

Mutex 應該更快,因為它……不那么復雜。

但是,如果您處理比 uint64 更復雜的東西,則 atomic.Value 的開銷可能沒問題。

例如,使用互斥鎖你需要一個特定的鎖定/解鎖順序,你可能會在沒有適當的測試+競爭條件檢測器的情況下發現一些問題。

而 atomic.Value 會為你處理這個。

我從不使用 sync.Map 但我在使用 atomic.Value 的生產中有非常高效的代碼 - 我對此沒有意見。

正確的基準需要更多的技術方法。


查看完整回答
反對 回復 2022-11-23
  • 1 回答
  • 0 關注
  • 131 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號