gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:33:30 26 4
gpt4 key购买 nike

我主要将常量用于文档目的,例如有用的变量名,或者当我反复重复某些字符串序列而又不想手动更改它们时。但是我想知道是否存在性能差异。我的假设是正确的,因为常量是在运行时替换的,所以文字和常量之间没有运行时的区别吗?
也许我误会了,但是我没有发现任何东西告诉我这是错误的。 Go Tour并没有在Constants博客上提供任何有值(value)的信息。

最佳答案

无论这个琐碎的程序,都没有一种或另一种说法:

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变体( hello)中,编译器在编译时被迫知道字符串文字 "hello"是字符串文字,而在 var变体( playground)中,编译器可能是惰性的,并假定变量 playground可能在其他功能中被修改。反过来,这又与编译器知道 fmt.Println是特定功能的能力(例如,GCC插入C printf函数的特殊知识的方式)相结合,可使编译器更轻松地将其编译为:
fmt.Printf("hello, %s\n", playground)
如果变量 reflect已更改,则仅发生一个运行时 playground的位置。但是现有的Go编译器使用 SSA(另请参见 https://golang.org/pkg/cmd/compile/internal/ssa/),并且没有对该变量进行写操作,因此我们可以在这里期望简单(通常是simple = fast)的运行时代码。
在使用 the Godbolt compiler site时,似乎在使用 const时,当前的编译器实际上必须向字符串插入一个转换。 var版本以更少的运行时代码结束。我没有使用插入的字符串文字对其进行测试。 %s伪指令从未在行中扩展,但是 fmt.Printf实际上确实直接调用 fmt.Fprintf,以 os.Stdout作为第一个参数。
总体而言,通常最好编写尽可能清晰的代码。然后,如果太慢(对于“太慢”的定义),请测量。但是,我自己过度进行编码时间优化感到内gui。 :-)

1 Don't anthropomorphize computers. They hate that!

关于performance - Golang-常量和常量之间的性能差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63545584/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com