为了账号安全,请及时绑定邮箱和手机立即绑定

Golang - 文字和常量之间的性能差异

Golang - 文字和常量之间的性能差异

Go
HUX布斯 2022-06-27 10:51:07
我主要将常量用于文档目的,例如有用的变量名称,或者当我一遍又一遍地重复某些字符串序列并且不想手动更改它们时。但我想知道是否有任何性能差异。我的假设是否正确,即文字和常量之间没有运行时差异,因为常量在运行时被替换?也许我误解了,但我没有发现任何东西告诉我这是错误的。Go Tour 没有提供任何有价值的信息,Constants 博客文章也没有。
查看完整描述

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作为第一个参数。


总的来说,你通常最好写出你能写的最清晰的代码。然后,如果它太慢(无论您对“太慢”的定义如何),请测量。不过,我对自己过度优化编码时间感到内疚。:-)


查看完整回答
反对 回复 2022-06-27
  • 1 回答
  • 0 关注
  • 106 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信