Size: a a a

2020 December 12

АП

Александр Попов... in Go-go!
сонная википедия
иногда экономит место на стеке, но чаще вызывает аллокацию в куче
читать тексты без отрицания намного конфортнее :)
источник

АП

Александр Попов... in Go-go!
Передаем ресивер по ссылке если:
1). Если метод мутирует данные/вызывает мьютексы
2). Является частью структы где уже есть метод "по ссылке"
3). Структура занимает большой обьем памяти на стеке
источник

с

сонная википедия... in Go-go!
Александр Попов
Передаем ресивер по ссылке если:
1). Если метод мутирует данные/вызывает мьютексы
2). Является частью структы где уже есть метод "по ссылке"
3). Структура занимает большой обьем памяти на стеке
2) даже если метод по ссылке, это не страшно, просто нужно чтоб все методы реализующие интерфейс имели одинаковый ресивер
источник

АД

Алексей Долгов... in Go-go!
коллеги, извиняюсь за глупый вопрос но указание capacity в make для слайса items := make([]TaskInterface, 0, 1000) должно спасать от аллокаций при items = append(items, item) ? или это бесполезно. и зачем тогда возможность указывать capacity есть?
источник

с

сонная википедия... in Go-go!
конечно
источник

с

сонная википедия... in Go-go!
append проверяет capacity и если он слишком маленький, переаллоцирует-копирует слайс
источник

АД

Алексей Долгов... in Go-go!
просто бенчмарки показывают 1 alloc/op даже если make([]TaskInterface, 0, 1000000000). вот и не могу въехать
источник

с

сонная википедия... in Go-go!
ну так аллокация одна
источник

с

сонная википедия... in Go-go!
просто большая
источник

Z

Zver in Go-go!
Алексей Долгов
просто бенчмарки показывают 1 alloc/op даже если make([]TaskInterface, 0, 1000000000). вот и не могу въехать
Выделять в любом случае надо. Но капасити задавать имеет смысл, когда примерно или точно знаете сколько вам надо.
источник

АД

Алексей Долгов... in Go-go!
а при for range аллокация происходит? Вот код некой очереди - https://gist.github.com/Delgus/2d3bf38fba9237e8d96997a532dffead/edit
есть бенчмарк
ffunc BenchmarkMemoryQueue_AddTask(b *testing.B) {
 queue := NewQueue()
 for n := 0; n < b.N; n++ {
   queue.AddTask(NewTask(LowestPriority, func() error {
     return nil
   }))
 }
}


BenchmarkMemoryQueue_AddTask-4           6983637               173 ns/op             126 B/op          1 allocs/op
источник

с

сонная википедия... in Go-go!
интерфейсы могут вызывать аллокации
источник

АД

Алексей Долгов... in Go-go!
да, разобрался. спасибо
источник

АД

Алексей Долгов... in Go-go!
func BenchmarkMemoryQueue_AddTask(b *testing.B) {
 queue := NewQueue()
 task := NewTask(LowestPriority, func() error {
   return nil
 })
 for n := 0; n < b.N; n++ {
   queue.AddTask(task)
 }
}
источник

Z

Zver in Go-go!
В new алокация.
источник

АД

Алексей Долгов... in Go-go!
вот так более честный бенчмарк
источник

с

сонная википедия... in Go-go!
а что вы, собственно, замеряете?
источник

Z

Zver in Go-go!
Попугаев.
источник

с

сонная википедия... in Go-go!
Алексей Долгов
func BenchmarkMemoryQueue_AddTask(b *testing.B) {
 queue := NewQueue()
 task := NewTask(LowestPriority, func() error {
   return nil
 })
 for n := 0; n < b.N; n++ {
   queue.AddTask(task)
 }
}
к слову, b.ResetTimer() позволяет сбросить счетчики, если хотите только цикл замерить
источник

Z

Zver in Go-go!
Или завернуть в субтест.
источник