如何解决Golang-文字和常量之间的性能差异
我通常将常量用于文档目的,例如有用的变量名,或者当我反复重复某些字符串序列而又不想手动更改它们时。但是我想知道是否存在性能差异。我的假设是正确的,因为常量是在运行时替换的,因此文字和常量之间没有运行时的区别吗?
也许我误会了,但是我没有发现任何东西告诉我这是错误的。巡回演唱会没有在Constants博客上提供任何有价值的信息。
解决方法
即使是这个琐碎的程序,也没有一种或另一种说法:
.nav-item.dropdown:hover ul.dropdown-menu.multi-level {
display: block;
}
当在星期二编译时,可能像闪电一样快,但是在星期五傍晚编译时,则像糖蜜一样慢。 (也许Go编译器急于回家喝啤酒和休假,并在星期五下午制作了糟糕的代码。 1 )
也就是说,如果您要进行比较,例如:
package main
func main() {}
我们可能会注意到,在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
是 specific 函数的能力,例如GCC插入C fmt.Println
函数的特殊知识的方式- 可以允许编译器更轻松地将其编译为:
printf
在变量fmt.Printf("hello,playground)
已更改的情况下,仅发生一个运行时reflect
的地方。但是现有的Go编译器使用SSA(另请参见https://golang.org/pkg/cmd/compile/internal/ssa/),并且没有对该变量进行写操作,因此我们可以在这里期待简单的(通常是simple = fast)运行时代码。
在使用the Godbolt compiler site时,似乎在使用playground
时,当前的编译器实际上必须向字符串插入一个转换。 const
版本的运行时代码更少了。我没有使用插入的字符串文字对其进行测试。 var
指令不会在行中扩展,但是%s
确实直接调用fmt.Printf
,并以fmt.Fprintf
作为第一个参数。
总体而言,通常最好编写尽可能的最清晰代码。然后,如果太慢(对于“太慢”的定义),请测量。但是,我自己过度进行编码时间优化感到内gui。 :-)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。