亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 138 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號