我開始通過 Donovan-Kernighan 的《Go 編程語言》一書學習 Golang。在第一章中,作者建議測試幾種替代的簡單回顯函數實現。我使用time函數來計算執行時間,如下所示: 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 ...命令構建代碼,我會得到結果:? go-hello-world ./echo2./echo281073./echo25591正如您所看到的,與第二個調用相比,第一個調用需要十倍的時間。請注意,我echo3在兩種情況下都調用相同的函數。我猜想第一次打電話需要fmt.Println很長時間。為此,我在第 31 行添加了函數調用并再次測試:? go-hello-world ./echo2Testing echo implementation./echo26327./echo24249您可以看到這兩個調用需要相似的時間。但真理的來源在哪里呢?另一個有趣的時刻是,當我通過go run ...命令運行代碼時,我得到的時間要少得多:? 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我認為當我使用構建命令創建二進制文件時,我會得到更有效的機器代碼來執行。您能解釋一下為什么它在實踐中以這種方式起作用嗎?環境:OS: ArchLinux 5.2.5-arch1-1-ARCHGo: go1.12.7 linux/amd64PS我對我的英語感到抱歉。更新#1
1 回答

墨色風雨
TA貢獻1853條經驗 獲得超6個贊
嘗試使用第 11.4 節中所示的基準測試技術編寫一個基準測試方法,其中循環運行每個方法數百次左右。
運行之間的差異可能是由多任務操作系統和計時器分辨率等引起的各種測量誤差。
另外,我認為當你進一步了解時可以返回練習(練習需要對主題有一定的熟悉度)
- 1 回答
- 0 關注
- 151 瀏覽
添加回答
舉報
0/150
提交
取消