亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

編譯器是否優化變量聲明?

編譯器是否優化變量聲明?

Go
繁華開滿天機 2023-08-14 16:20:19
給定一個迭代: LOOP: for {              select {       case <-timeout:         t.Fatal("Timed out")       default:         if Count() == int64(num) {            break LOOP         }         time.Sleep(5 * time.Millisecond)       }    }Count()返回一個int64,所以我需要轉換和Count更改,所以我們在這里檢查直到Count()返回預期值 - 可能是數千次迭代。編譯器是否優化此轉換?或者在開始循環之前預先將num在其他地方使用過的 asint和 not轉換為更好?int64
查看完整描述

2 回答

?
墨色風雨

TA貢獻1853條經驗 獲得超6個贊

它是否優化可能取決于您未顯示的其他代碼,以及編譯器版本/目標體系結構。雖然我懷疑何時涉及并發和其他函數調用,但性能瓶頸將是int=>int64轉換。如果取消該轉換,您很可能不會看到任何差異。

另請注意,如果您使用的體系結構是 64 位,則int和的大小(以及內存表示和解釋)int64是相同的,這意味著轉換不會產生任何成本,它只是更改類型(如何解釋)。

編輯:由于您無論如何都在使用睡眠,因此擺脫轉換是沒有意義的。使用使您的代碼更具可讀性的任何一個。


查看完整回答
反對 回復 2023-08-14
?
婷婷同學_

TA貢獻1844條經驗 獲得超8個贊

Go amd64 匯編器:


0000000000457bb0 <main.Equality>:

? 457bb0:? ?48 8b 44 24 08? ? ? ? ? mov? ? 0x8(%rsp),%rax

? 457bb5:? ?48 8b 4c 24 10? ? ? ? ? mov? ? 0x10(%rsp),%rcx

? 457bba:? ?48 39 c8? ? ? ? ? ? ? ? cmp? ? %rcx,%rax

? 457bbd:? ?0f 94 44 24 18? ? ? ? ? sete? ?0x18(%rsp)

? 457bc2:? ?c3? ? ? ? ? ? ? ? ? ? ? retq

正如預期的那樣,速度很快。

編譯器知道,對于 amd64,intint64.?無需轉換。


opt.go:

package main


//go:noinline

func Equality(a int64, b int) bool {

? ? return a == int64(b)

}


func main() {

? ? var a, b = int64(42), int(39)

? ? println(Equality(a, b))

}

傾倒:


$ go build opt.go

$ objdump -d opt > opt.dump


查看完整回答
反對 回復 2023-08-14
  • 2 回答
  • 0 關注
  • 159 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號