我開(kāi)始通過(guò) Donovan-Kernighan 的《Go 編程語(yǔ)言》一書(shū)學(xué)習(xí) Golang。在第一章中,作者建議測(cè)試幾種替代的簡(jiǎn)單回顯函數(shù)實(shí)現(xiàn)。我使用time函數(shù)來(lái)計(jì)算執(zhí)行時(shí)間,如下所示: 29 func main() { 30 var start, end int64 31 //fmt.Println("Testing echo implementation") 32 start = time.Now().UTC().UnixNano() 33 echo3() 34 end = time.Now().UTC().UnixNano() 35 fmt.Println(end - start) 36 start = time.Now().UTC().UnixNano() 37 echo3() 38 end = time.Now().UTC().UnixNano() 39 fmt.Println(end - start) 40 }如果我使用go build ...命令構(gòu)建代碼,我會(huì)得到結(jié)果:? go-hello-world ./echo2./echo281073./echo25591正如您所看到的,與第二個(gè)調(diào)用相比,第一個(gè)調(diào)用需要十倍的時(shí)間。請(qǐng)注意,我echo3在兩種情況下都調(diào)用相同的函數(shù)。我猜想第一次打電話需要fmt.Println很長(zhǎng)時(shí)間。為此,我在第 31 行添加了函數(shù)調(diào)用并再次測(cè)試:? go-hello-world ./echo2Testing echo implementation./echo26327./echo24249您可以看到這兩個(gè)調(diào)用需要相似的時(shí)間。但真理的來(lái)源在哪里呢?另一個(gè)有趣的時(shí)刻是,當(dāng)我通過(guò)go run ...命令運(yùn)行代碼時(shí),我得到的時(shí)間要少得多:? go-hello-world go run echo2.goTesting echo implementation/tmp/go-build040243191/b001/exe/echo21743/tmp/go-build040243191/b001/exe/echo21133? go-hello-world go run echo2.go/tmp/go-build646239204/b001/exe/echo234525/tmp/go-build646239204/b001/exe/echo21133我認(rèn)為當(dāng)我使用構(gòu)建命令創(chuàng)建二進(jìn)制文件時(shí),我會(huì)得到更有效的機(jī)器代碼來(lái)執(zhí)行。您能解釋一下為什么它在實(shí)踐中以這種方式起作用嗎?環(huán)境:OS: ArchLinux 5.2.5-arch1-1-ARCHGo: go1.12.7 linux/amd64PS我對(duì)我的英語(yǔ)感到抱歉。更新#1
1 回答

墨色風(fēng)雨
TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超6個(gè)贊
嘗試使用第 11.4 節(jié)中所示的基準(zhǔn)測(cè)試技術(shù)編寫(xiě)一個(gè)基準(zhǔn)測(cè)試方法,其中循環(huán)運(yùn)行每個(gè)方法數(shù)百次左右。
運(yùn)行之間的差異可能是由多任務(wù)操作系統(tǒng)和計(jì)時(shí)器分辨率等引起的各種測(cè)量誤差。
另外,我認(rèn)為當(dāng)你進(jìn)一步了解時(shí)可以返回練習(xí)(練習(xí)需要對(duì)主題有一定的熟悉度)
- 1 回答
- 0 關(guān)注
- 149 瀏覽
添加回答
舉報(bào)
0/150
提交
取消