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