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 关注
- 122 浏览
添加回答
举报