Goがいくつかの割り当てを行うかどうかを見つける最も簡単な方法は、ベンチマークを書くことです。
package sof
import "log"
const (
HELLO = "hello"
)
func forString(max int) {
for i := 0; i < max; i++ {
logMsg("hello", false)
}
}
func forConst(max int) {
for i := 0; i < max; i++ {
logMsg(HELLO, false)
}
}
func logMsg(msg string, stdOut bool) {
if stdOut {
log.Println(msg)
}
}
ベンチマーク:あなたのケースでは、コードは次のようになります
package sof
import "testing"
func BenchmarkForString(b *testing.B) {
for i := 0; i < b.N; i++ {
forString(i)
}
}
func BenchmarkForConst(b *testing.B) {
for i := 0; i < b.N; i++ {
forConst(i)
}
}
次に、あなただけのベンチマークを実行することができます。
go test -bench=. -benchmem
非常に重要-benchmemフラグです。それがなければ、ベンチマークではベンチマーク時間だけがわかります。1回の操作あたりの割り当て数と平均割り当てサイズに関する情報は得られません。ベンチマークの
出力:あなたは配分の大きさとその数についての情報を持っている最後の2列に
testing: warning: no tests to run
BenchmarkForString-4 100000 133551 ns/op 0 B/op 0 allocs/op
BenchmarkForConst-4 100000 128585 ns/op 0 B/op 0 allocs/op
PASS
ok .../sof 26.475s
。あなたの例では、両方の関数が割り当てをしないことを意味するゼロだけがあります。)
私はコンパイラが文字列をインライン化し、それをX回割り当てないことを確信しています。言語がそれをしたら、私はそれを使わないだろう。 – squiguy
両方の例のアセンブリ出力を 'go tool compile -S'と比較する –