Привет всем!
Хочу сформулировать feature request
Вот небольшой пример бенчмарка. Здесь переменная создается в точках (1), (2) и (3)
Однако будет ли эта переменная выделена в куче или останется стековой зависит от того,
что написано в точке (4), которая может быть вообще в другом файле. По одному только
типу переменной понять это невозможно.
package main
import (
"testing"
)
type subject struct {
payload1 int
payload2 int
payload3 int
payload4 int
payload5 int
payload6 int
}
func (s subject) passByValue() ( result int ) {
result += s.payload1
result += s.payload2
result += s.payload3
result += s.payload4
result += s.payload5
result += s.payload6
result += further(&s)
return result
}
func (s *subject) passByReference() ( result int ) {
result += s.payload1
result += s.payload2
result += s.payload3
result += s.payload4
result += s.payload5
result += s.payload6
result += further(s)
return result
}
func further(s *subject) ( result int ) {
s.payload1 = s.payload2
s.payload2 = s.payload3
s.payload3 = s.payload4
s.payload4 = s.payload5
s.payload5 = s.payload6
s.payload6 = s.payload1
result += s.payload1
result += s.payload2
result += s.payload3
result += s.payload4
result += s.payload5
result += s.payload6
// g_Subject = s // (4)
return result
}
var g_Subject *subject = nil
func BenchmarkMethodCallByValue(b *testing.B) {
counter := 0
for i := 0; i < b.N; i++ {
var s subject = subject{} // (1)
counter += s.passByValue()
}
}
func BenchmarkMethodCallByReferenceA(b *testing.B) {
counter := 0
for i := 0; i < b.N; i++ {
var s subject = subject{} // (2)
counter += s.passByReference()
}
}
func BenchmarkMethodCall2ByReferenceB(b *testing.B) {
counter := 0
for i := 0; i < b.N; i++ {
var s *subject = &subject{} // (3)
counter += s.passByReference()
}
}
В таком виде бенчмарк показывает, что никакой работы с кучей нет.
Если (4) раскомментировать, то будет показано одно выделение памяти на операцию.
Было бы здорово, если бы можно было навести курсор на объявление переменной и увидеть
стековая она или нет. Ещё круче было бы, если б можно было найти все места в коде, из-за
которых переменная не является стековой. Мне кажется, это был бы бесценный инструмент
для оптимизации по памяти.
Что скажете, комрады из JetBrains?
Здравствуйте, SergASh, Вы писали:
SAS>Хочу сформулировать feature request
Это лучше формулировать в
трекере
Я им передал)
Здравствуйте, SergASh, Вы писали:
SAS>Привет всем!
SAS>Хочу сформулировать feature request
SAS>Вот небольшой пример бенчмарка. Здесь переменная создается в точках (1), (2) и (3)
SAS>Однако будет ли эта переменная выделена в куче или останется стековой зависит от того,
SAS>что написано в точке (4), которая может быть вообще в другом файле. По одному только
SAS>типу переменной понять это невозможно.
SAS>В таком виде бенчмарк показывает, что никакой работы с кучей нет.
SAS>Если (4) раскомментировать, то будет показано одно выделение памяти на операцию.
SAS>Было бы здорово, если бы можно было навести курсор на объявление переменной и увидеть
SAS>стековая она или нет. Ещё круче было бы, если б можно было найти все места в коде, из-за
SAS>которых переменная не является стековой. Мне кажется, это был бы бесценный инструмент
SAS>для оптимизации по памяти.
SAS>Что скажете, комрады из JetBrains?
Привет, отличная идея! Мы отслеживаем ее в тикете
GO-1690. Можно за него проголосовать, чтобы получать уведомления об обновлениях. Но, боюсь, что в ближайшее время мы до нее не доберемся.