第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Go map 與 C# 字典

Go map 與 C# 字典

Go
回首憶惘然 2021-12-07 16:18:49
我寫了一個(gè)快速而骯臟的測(cè)試來(lái)檢查 Go 與 C# 在并發(fā)查找訪問(wèn)方面的性能,結(jié)果令我感到驚訝。這是一個(gè)非常簡(jiǎn)單的例子,我不是 Go 專家,但測(cè)試只是在地圖上執(zhí)行 1,000,000 次鎖定/檢查/添加/解鎖操作,它只是單線程的,因?yàn)槲抑粰z查這些功能:package mainimport (    "fmt"    "sync"    "time")var mu sync.Mutexfunc main() {    cache := make(map[int]int, 1000000)    start := time.Now()    for i := 0; i < 1000000; i++ {        mu.Lock()        if _, ok := cache[i]; ok == false {            cache[i] = i        }        mu.Unlock()    }    end := time.Since(start)    fmt.Println(end)    var sum int64    for _, v := range cache {        sum += int64(v)    }    fmt.Println(sum)}在 C# 中也是同樣的事情(通過(guò) LINQPad):void Main(){    var cache = new Dictionary<int, int>(1000000);    var sw = Stopwatch.StartNew();    for (var i = 0; i < 1000000; i++)    {        lock (cache)        {            int d;            if (cache.TryGetValue(i, out d) == false)            {                cache.Add(i, i);            }        }    }    $"{sw.ElapsedMilliseconds:N0}ms".Dump();    var sum = 0L;    foreach (var kvp in cache)    {        sum += kvp.Value;    }    sum.Dump();}我將兩個(gè)集合的元素相加以確保它們匹配 (499,999,500,000) 并打印花費(fèi)的時(shí)間。結(jié)果如下:C#:56 毫秒運(yùn)行時(shí)間:327 毫秒我已經(jīng)檢查過(guò)無(wú)法初始化地圖的大小,只能初始化容量,所以我想知道我是否可以做些什么來(lái)提高 Go 地圖的性能?在沒(méi)有地圖訪問(wèn)權(quán)限的情況下,Go 執(zhí)行 1,000,000 次鎖定/解鎖操作需要 32 毫秒。
查看完整描述

3 回答

?
喵喵時(shí)光機(jī)

TA貢獻(xiàn)1846條經(jīng)驗(yàn) 獲得超7個(gè)贊

[S]o 我想知道我是否可以做些什么來(lái)提高 Go 地圖的性能?

不,那里沒(méi)有。Go 基本上沒(méi)有性能旋鈕。

(請(qǐng)注意,Go 的map類型是一個(gè)非常通用且健壯的哈希映射,它使用強(qiáng)加密哈希(如果可能)來(lái)防止攻擊并強(qiáng)制使用隨機(jī)密鑰/迭代順序。它是“完全通用的”,而不僅僅是“快速字典”。)

完全正確:有環(huán)境變量GOGC可以“調(diào)整”GC。


查看完整回答
反對(duì) 回復(fù) 2021-12-07
?
蠱毒傳說(shuō)

TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超3個(gè)贊

可能有一件事被忽視了,把整個(gè)練習(xí)變成了蘋果和橘子:同步。在 Go 方面,您使用 Mutex,它在每次訪問(wèn)時(shí)都會(huì)進(jìn)入內(nèi)核。在 C# 方面,您使用 lock(){},它使用 SpinLock 的組合,并且僅在需要時(shí)回退到內(nèi)核調(diào)用。由于您的測(cè)試無(wú)論如何都是在單個(gè)線程中執(zhí)行的,因此 C# 甚至從未進(jìn)入內(nèi)核。

在 Go 中不鼓勵(lì)使用互斥鎖,而應(yīng)該使用通道來(lái)進(jìn)行同步。

幾個(gè)建議: 1. 如果您想自己對(duì)地圖/字典進(jìn)行基準(zhǔn)測(cè)試,請(qǐng)刪除同步。2. 如果您想對(duì)并發(fā)性能進(jìn)行基準(zhǔn)測(cè)試,請(qǐng)使用正確的構(gòu)造和范式編寫您的測(cè)試。

干杯!


查看完整回答
反對(duì) 回復(fù) 2021-12-07
?
料青山看我應(yīng)如是

TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超8個(gè)贊

我發(fā)現(xiàn)如果我縮小 1000000 到 100000,golang 速度會(huì)從 151.0087ms 變?yōu)?10.0005ms(15.1 乘法),而 csharp 版本從 65ms 變?yōu)?9ms(7.22 乘法),所以這意味著 golang 的 hashmap 難以處理大地圖?


我寫了一個(gè)簡(jiǎn)單的 go benchmark 程序,像這樣


func BenchmarkIntMapGet100(b *testing.B) {

    count := 100

    setupIntMap(b, count)


    b.ResetTimer()

    for i:=0; i<b.N; i++{

        _, _ = intMap[i%count]

    }

}

我得到了結(jié)果


BenchmarkIntMapGet10-4          100000000           15.6 ns/op

BenchmarkIntMapGet100-4         100000000           17.1 ns/op

BenchmarkIntMapGet1000-4        50000000            25.7 ns/op

BenchmarkIntMapGet10000-4       50000000            32.3 ns/op

BenchmarkIntMapGet100000-4      30000000            39.2 ns/op

BenchmarkIntMapGet1000000-4     20000000            67.2 ns/op

BenchmarkIntMapGet10000000-4    20000000            82.3 ns/op


查看完整回答
反對(duì) 回復(fù) 2021-12-07
  • 3 回答
  • 0 關(guān)注
  • 201 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)