Re: [GoLand] Народ просит фичу
От: qxWork Голландия http://www.jetbrains.com/company/people/Coox_Sergey.html
Дата: 26.03.21 10:30
Оценка: 6 (1) +1
Здравствуйте, SergASh, Вы писали:

SAS>Хочу сформулировать feature request

Это лучше формулировать в трекере
Я им передал)
[GoLand] Народ просит фичу
От: SergASh  
Дата: 24.03.21 09:53
Оценка: +1
Привет всем!

Хочу сформулировать 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?
Отредактировано 24.03.2021 9:58 SergASh . Предыдущая версия .
Re: [GoLand] Народ просит фичу
От: Pzz Россия https://github.com/alexpevzner
Дата: 26.03.21 18:24
Оценка:
Здравствуйте, SergASh, Вы писали:

SAS>Было бы здорово, если бы можно было навести курсор на объявление переменной и увидеть

SAS>стековая она или нет. Ещё круче было бы, если б можно было найти все места в коде, из-за
SAS>которых переменная не является стековой. Мне кажется, это был бы бесценный инструмент
SAS>для оптимизации по памяти.

Это может зависеть от версии компилятора.
Re: [GoLand] Народ просит фичу
От: artspb Россия https://artspb.me
Дата: 28.03.21 08:31
Оценка:
Здравствуйте, SergASh, Вы писали:

SAS>Привет всем!


SAS>Хочу сформулировать feature request


SAS>Вот небольшой пример бенчмарка. Здесь переменная создается в точках (1), (2) и (3)

SAS>Однако будет ли эта переменная выделена в куче или останется стековой зависит от того,
SAS>что написано в точке (4), которая может быть вообще в другом файле. По одному только
SAS>типу переменной понять это невозможно.

SAS>В таком виде бенчмарк показывает, что никакой работы с кучей нет.

SAS>Если (4) раскомментировать, то будет показано одно выделение памяти на операцию.

SAS>Было бы здорово, если бы можно было навести курсор на объявление переменной и увидеть

SAS>стековая она или нет. Ещё круче было бы, если б можно было найти все места в коде, из-за
SAS>которых переменная не является стековой. Мне кажется, это был бы бесценный инструмент
SAS>для оптимизации по памяти.

SAS>Что скажете, комрады из JetBrains?


Привет, отличная идея! Мы отслеживаем ее в тикете GO-1690. Можно за него проголосовать, чтобы получать уведомления об обновлениях. Но, боюсь, что в ближайшее время мы до нее не доберемся.
Отредактировано 28.03.2021 8:32 artspb . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.