Самый простой способ определить, использует ли 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 флаг. Без этого ваш бенчмарк расскажет вам только о контрольном времени - вы не получите информацию о количестве распределений и среднем размере распределения за операцию.
Выход бенчмарка:
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
В последние 2 колонки у Вас есть информация о размере ассигнований и его номер. В вашем примере есть только нули, что означает, что обе funcs не делают никаких распределений:)
Я уверен, что компилятор будет встраивать строку и не выделять ее X раз. Если бы язык сделал это, я бы не использовал его. – squiguy
Сравните выходы сборки обоих примеров с помощью 'go tool compile -S' –