1 回答

TA貢獻(xiàn)1803條經(jīng)驗(yàn) 獲得超3個(gè)贊
您的測(cè)試存在多個(gè)問題。
1) 您正在使用大約 150.000 個(gè)不同的鍵填充字典,所有鍵都具有相同的值。
2) 所有條目的共享值是一個(gè)包含 30.000 個(gè)整數(shù)的數(shù)組,并且您將在一半的調(diào)用中更新其中的每個(gè)元素AddOrUpdate
。但這僅在您測(cè)試時(shí)才會(huì)發(fā)生ConcurrentDictionary
。在SyncDict
測(cè)試中,有一個(gè)條件if (result == value) return AddOrUpdateStatus.Unchanged
會(huì)跳過(guò)所有更新(因?yàn)樵撝凳枪蚕淼模?/p>
3)您正在使用不同的隨機(jī)輸入來(lái)提供兩個(gè)測(cè)試。
4) 您正在使用循環(huán)更新數(shù)組Parallel.For
,同時(shí)已經(jīng)處于外部Parallel.For
循環(huán)中,從而過(guò)度并行化您的工作負(fù)載。
5)?調(diào)用該方法時(shí),AddOrUpdate
您忽略了記錄的事實(shí),即該updateValueFactory
函數(shù)以線程不安全的方式調(diào)用,并且由于多個(gè)函數(shù)AddOrUpdate
是同步執(zhí)行的并且該值是共享的,因此您正在破壞該值的狀態(tài)。
在鎖之外調(diào)用委托
updateValueFactory
以避免在鎖下執(zhí)行未知代碼可能引起的問題。
ConcurrentDictionary.AddOrUpdate 方法
我建議您修改測(cè)試以反映該類的預(yù)期用途ConcurrentDictionary
。
- 1 回答
- 0 關(guān)注
- 160 瀏覽
添加回答
舉報(bào)