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

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

golang循環(huán)初始比剩余慢

golang循環(huán)初始比剩余慢

Go
蝴蝶刀刀 2023-06-19 16:04:14
我是 golang 的新手,在做這個(gè) poc 時(shí),我注意到在運(yùn)行 for 循環(huán)時(shí)有一個(gè)奇怪的行為。    package main;    import (        "log"        "strings"        "time"    )    type data struct {        elapseTime int64        data string    }    func main(){        for i := 0 ; i < 10; i++{            c := make(chan data);            go removeDuplicates("I love oranges LALALA I LOVE APPLES LALALA XD", c);            log.Printf("%v", <- c);        }    }    func removeDuplicates(value string , c chan data){        start := time.Now();        var d = data{};        var r string;        value = strings.ToLower(value);        var m = make(map[string]string);        splitVals := strings.Split(value, " ");        for _, element := range splitVals {            if _, ok := m[element]; ok == false {                m[element] = element;            }        }        for k, _ := range m {            r = r + k + " ";        }        d.data = strings.TrimRight(r, "");        d.elapseTime = time.Since(start).Nanoseconds();        c <- d;    }實(shí)際上,我想要實(shí)現(xiàn)的是刪除一個(gè)簡(jiǎn)單字符串的重復(fù)項(xiàng),并將這些信息連同所花費(fèi)的時(shí)間一起打印出來(lái)。一個(gè)循環(huán)通過(guò) go routine 運(yùn)行 10 次,等待通過(guò)通道的響應(yīng)。2019/05/24 00:55:49 {18060 i love oranges lalala apples xd }2019/05/24 00:55:49 {28930 love oranges lalala apples xd i }2019/05/24 00:55:49 {10393 i love oranges lalala apples xd }2019/05/24 00:55:49 {1609 oranges lalala apples xd i love }2019/05/24 00:55:49 {1877 i love oranges lalala apples xd }2019/05/24 00:55:49 {1352 i love oranges lalala apples xd }2019/05/24 00:55:49 {1708 i love oranges lalala apples xd }2019/05/24 00:55:49 {1268 apples xd i love oranges lalala }2019/05/24 00:55:49 {1736 oranges lalala apples xd i love }2019/05/24 00:55:49 {1037 i love oranges lalala apples xd }這是我所看到的:循環(huán)的前幾次打?。o(wú)論是單循環(huán)還是 100x 循環(huán)都無(wú)關(guān)緊要)將比循環(huán)的其余部分慢得多。這是有原因的嗎?(執(zhí)行時(shí)間以納秒為單位)編輯:刪除開關(guān)部分,因?yàn)槿藗儗?duì)這個(gè)問(wèn)題感到困惑。
查看完整描述

1 回答

?
墨色風(fēng)雨

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

并發(fā)不是并行。通道的這種特殊使用結(jié)果與僅從 返回值非常相似removeDuplicates,只是兩個(gè) goroutine 需要協(xié)調(diào)它們對(duì)通道的使用會(huì)產(chǎn)生額外的開銷。

具體來(lái)說(shuō):

  • 循環(huán)的每次迭代都有自己的通道,每個(gè)通道只能容納一個(gè)元素。

  • 在所有語(yǔ)句都已執(zhí)行之前,循環(huán)無(wú)法繼續(xù)下一次迭代,包括對(duì)該語(yǔ)句的調(diào)用log.Printf阻塞,直到從通道接收到值。

  • removeDuplicates檢測(cè)到實(shí)時(shí)時(shí)間已經(jīng)過(guò)去了多少,而不是在解決問(wèn)題上花費(fèi)了多少時(shí)間。這是評(píng)論說(shuō)它首先不是一個(gè)很好的基準(zhǔn)的眾多原因之一。

推測(cè):在循環(huán)的前幾次迭代中,goroutine 可能removeDuplicates會(huì)初始化start,然后將執(zhí)行時(shí)間交給主 goroutine。然后 main goroutine 立即檢查 mutex on?c,發(fā)現(xiàn)它還不能做任何事情,并返回給調(diào)度程序,所有這些檢查和上下文切換增加了數(shù)千納秒(關(guān)心這通常是微基準(zhǔn)測(cè)試的味道到goroutineremoveDuplicates的實(shí)時(shí)執(zhí)行。main在幾次迭代之后,某些東西(也許是 Go 運(yùn)行時(shí))發(fā)現(xiàn)了在返回之前永遠(yuǎn)無(wú)法取得進(jìn)展的事實(shí)removeDuplicates,并且避免了上下文切換。

我知道此時(shí)您對(duì)解釋比建議更感興趣,但如果我不指出比較 Go 和 Java 的基準(zhǔn)已經(jīng)存在,我會(huì)覺(jué)得很不負(fù)責(zé)任。即使您想自己編寫,我也建議使用類似的方法:根據(jù)需要完成的任務(wù)定義基準(zhǔn)程序,然后使用每種語(yǔ)言(或框架)中可用的最佳工具來(lái)完成工作具有良好的性能。


查看完整回答
反對(duì) 回復(fù) 2023-06-19
  • 1 回答
  • 0 關(guān)注
  • 134 瀏覽
慕課專欄
更多

添加回答

舉報(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)