1 回答

TA貢獻1829條經驗 獲得超4個贊
即使是這個微不足道的程序,也沒有任何方式可以說明:
package main
func main() {}
在星期二編譯時可能會像閃電一樣快,但在星期五下午晚些時候編譯時會像糖蜜一樣慢。(也許 Go 編譯器急于回家喝杯啤酒和周末休息,并在周五下午產生了糟糕的代碼。1)
也就是說,如果你正在比較,例如:
package main
import (
"fmt"
)
const hello = "hello"
var playground = "playground"
func main() {
fmt.Printf("%s, %s\n", hello, playground)
}
我們可能會注意到,在const變體(_ _其他功能。反過來,這與編譯器知道這是一個特定函數的能力相結合——例如,GCC 插入 C函數的特殊知識的方式——可以讓編譯器更容易地將其編譯為:hello"hello"varplaygroundplaygroundfmt.Printlnprintf
fmt.Printf("hello, %s\n", playground)
reflect如果變量playground已更改,則僅發生一個運行時。但是現有的 Go 編譯器使用SSA(另見https://golang.org/pkg/cmd/compile/internal/ssa/)并且沒有寫入變量,所以我們可以期待簡單(通常簡單 = 快速)運行時代碼在這里。
使用Godbolt編譯器站點,似乎在使用時const,當前編譯器實際上必須插入一次轉換為字符串。該var版本以更少的運行時代碼結束。我沒有插入字符串文字來測試它。%s指令從不在線擴展,而是直接fmt.Printf調用fmt.Fprintf,os.Stdout作為第一個參數。
總的來說,你通常最好寫出你能寫的最清晰的代碼。然后,如果它太慢(無論您對“太慢”的定義如何),請測量。不過,我對自己過度優化編碼時間感到內疚。:-)
- 1 回答
- 0 關注
- 138 瀏覽
添加回答
舉報