第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Golang - 文字和常量之間的性能差異

Golang - 文字和常量之間的性能差異

Go
HUX布斯 2022-06-27 10:51:07
我主要將常量用于文檔目的,例如有用的變量名稱,或者當(dāng)我一遍又一遍地重復(fù)某些字符串序列并且不想手動(dòng)更改它們時(shí)。但我想知道是否有任何性能差異。我的假設(shè)是否正確,即文字和常量之間沒有運(yùn)行時(shí)差異,因?yàn)槌A吭谶\(yùn)行時(shí)被替換?也許我誤解了,但我沒有發(fā)現(xiàn)任何東西告訴我這是錯(cuò)誤的。Go Tour 沒有提供任何有價(jià)值的信息,Constants 博客文章也沒有。
查看完整描述

1 回答

?
浮云間

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超4個(gè)贊

即使是這個(gè)微不足道的程序,也沒有任何方式可以說明:


package main

func main() {}

在星期二編譯時(shí)可能會(huì)像閃電一樣快,但在星期五下午晚些時(shí)候編譯時(shí)會(huì)像糖蜜一樣慢。(也許 Go 編譯器急于回家喝杯啤酒和周末休息,并在周五下午產(chǎn)生了糟糕的代碼。1)


也就是說,如果你正在比較,例如:


package main


import (

    "fmt"

)

const hello = "hello"

var playground = "playground"


func main() {

    fmt.Printf("%s, %s\n", hello, playground)

}

我們可能會(huì)注意到,在const變體(_ _其他功能。反過來,這與編譯器知道這是一個(gè)特定函數(shù)的能力相結(jié)合——例如,GCC 插入 C函數(shù)的特殊知識(shí)的方式——可以讓編譯器更容易地將其編譯為:hello"hello"varplaygroundplaygroundfmt.Printlnprintf


fmt.Printf("hello, %s\n", playground)

reflect如果變量playground已更改,則僅發(fā)生一個(gè)運(yùn)行時(shí)。但是現(xiàn)有的 Go 編譯器使用SSA(另見https://golang.org/pkg/cmd/compile/internal/ssa/)并且沒有寫入變量,所以我們可以期待簡(jiǎn)單(通常簡(jiǎn)單 = 快速)運(yùn)行時(shí)代碼在這里。


使用Godbolt編譯器站點(diǎn),似乎在使用時(shí)const,當(dāng)前編譯器實(shí)際上必須插入一次轉(zhuǎn)換為字符串。該var版本以更少的運(yùn)行時(shí)代碼結(jié)束。我沒有插入字符串文字來測(cè)試它。%s指令從不在線擴(kuò)展,而是直接fmt.Printf調(diào)用fmt.Fprintf,os.Stdout作為第一個(gè)參數(shù)。


總的來說,你通常最好寫出你能寫的最清晰的代碼。然后,如果它太慢(無論您對(duì)“太慢”的定義如何),請(qǐng)測(cè)量。不過,我對(duì)自己過度優(yōu)化編碼時(shí)間感到內(nèi)疚。:-)


查看完整回答
反對(duì) 回復(fù) 2022-06-27
  • 1 回答
  • 0 關(guān)注
  • 155 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)