Maxim
Go Newsletter
Valentin
Вот реализация мапы https://tip.golang.org/src/sync/map.go работать должна со скоростью map[interface{}]interface{} с мьютексом
Brown
type T1 = T2 вот это вроде круть)
Антон
monotonic time наконец то впиливают
Valentin
Там еще сверху нахуевечено с atomic.Value, так что вангую, что будет работать чуть медленее. С другой стороны, sync.Map это абстракция, которая делает код чище, в большинстве случаев замедление будет незаметно :) К сожалению сейчас не могу побенчить, может кто-нибудь еще проверит и покажет нам результаты
Anonymous
Я правильно понимаю, что при добавлении mutex скорость работы мапы ограничится одним процом?
Zver
Я правильно понимаю, что при добавлении mutex скорость работы мапы ограничится одним процом?
Если атомик используется, то могут паралельные быть обращения к разным элементам (кроме вставки и удаления)
Zver
Надо смотреть.
Anonymous
Попробовал, вроде кушает все процы
Michael
Я правильно понимаю, что при добавлении mutex скорость работы мапы ограничится одним процом?
там скорее всего мьютекс нужен для вставки, на чтение там ничего нет
Ivan
в смысле может быть такое, но это будет работать неправильно)
Michael
мьютекс и атомик местами есть в методе Load
Valentin
Там два раза мапа хранится, одна с атомником только на чтения, вторая с мьютексом для записи
Сережа
у го точно потребление памяти меньше джавы?
Сережа
а может есть статья какая-нибудь? с графиками?
А ВОТ ТЕПЕРЬ ПАБЛИК
https://benchmarksgame.alioth.debian.org/u64q/go.html
А ВОТ ТЕПЕРЬ ПАБЛИК
смотри память
Сережа
спасибо, а не на числодробилках сравнение?
Сережа
а правда что gc не упаковывает память в го и она фрагментируется?
Сережа
а когда памяти не хватает просто берет у системы еще столько же, сколько уже выделенно
Anonymous
а когда памяти не хватает просто берет у системы еще столько же, сколько уже выделенно
Типа потребления памяти в геометрической прогрессии? Сначала 1кб, потом 2кб, затем 4кб и т.д.? 😄
Сережа
ну там есть вроде переменная окружения
Сережа
по умолчанию 100%, т.е. столько сколько уже есть выделить
Anonymous
Я такого не встречал. Из проблем с памятью я только слыхал, что go не чистит мапы от удалённых элементов.
Anonymous
Попробовал, вроде кушает все процы
Мой итог тестов на коленке - mutex замедляет параллельную вставку в мапу в ~2.3 раза по сравнению с последовательной вставкой
Michael
а правда что gc не упаковывает память в го и она фрагментируется?
Го гц просто берёт данные кредитки хозяина и докупает оперативы у гугли
Michael
экономика потребления
Сережа
и в виде компенсации заодно заказывает хозяину карты дилду в виде суслика
Michael
Я такого не встречал. Из проблем с памятью я только слыхал, что go не чистит мапы от удалённых элементов.
не встречал, покрайней мере у меня всё отлично работало, и идиоматичный пример удаления ключей из мапы отрабатывал как и задумано
Anonymous
Только что попробовал на 1.8.3 - залил в мапу кучу элементов. Потом поочереди все удалил из мапы delete'ом. Оперативку обратно go не отдаёт.
Сережа
ладно, это придирки, все равно бинарник в контейнере наверное работает, а память выделяется на контейнер
Anonymous
а код и чем смотрел можно?
Код не могу кинуть, на работе нет тырнетов (( смотрел диспетчером задач винды ))
Сережа
https://deferpanic.com/blog/understanding-golang-memory-usage/
Valentin
Только что попробовал на 1.8.3 - залил в мапу кучу элементов. Потом поочереди все удалил из мапы delete'ом. Оперативку обратно go не отдаёт.
Го выделяет сколько надо в хипе памяти, а после удаления ресурсов держит у себя, чтобы снова не делать системный вызов "дай мне памяти", го возьмёт место из хипа
Michael
ну это обычное поведение гц
Michael
также если система или что-то попросит памяти, то го гц уменшит размер резерва
Anonymous
также если система или что-то попросит памяти, то го гц уменшит размер резерва
Не слыхал такого, что у программ можно запрашивать память обратно ))
Mike
Память есть? А если найду?
Michael
https://github.com/golang/go/issues/14521
Michael
статьи не нашёл
Michael
но там есть комментарии Чени и компании именно как это сделано в рантайме Гоу
Michael
а там как ОС решит
Michael
запусти один экземпляр своего приложения, удали все элементы мапы, отправь в сон приложение, запусти второй экземпляр и посмотри что будет происходить
Michael
второй будет кушать, первый будет добрым и поделится ресурсом
Anonymous
Ну вас нах
Anonymous
Ну вас нах
За что ты нас так ((
Michael
джава фан?
В
проверили? так и происходит?
Anonymous
проверили? так и происходит?
Windows 7 - система уходит в swap, оперативу не отдаёт ни один из экземпляров прог. Доберусь до дома, попробую в Linux...
Anton 🇺🇦
когда liteide x32 в релиз выложат?
Michael
проверили? так и происходит?
ссылка выше на гитхаб, там обсуждение Чени и компании
Anonymous
покажешь код
примерно через полчасика покажу как тестирую
В
А еще "доверяй, но проверяй"
Сережа
А еще "зачем пачкать руки самому"
Mike
А еще, а еще...! ой, да ну вас =(
Anonymous
покажешь код
https://play.golang.org/p/g-kV89MP6z
В
А еще "зачем пачкать руки самому"
я вроде никого не призывал ничего тестить, это во-первых, во-вторых, я с удовольствие "запачкаюсь" дома, вчером, после работы
Anonymous
Каждый экземпляр проги ест ~600 Mb private bytes
Anonymous
Протестировал под Linux (ARM 32 bit, 1Gb RAM). Каждый экземпляр программы ~300 Mb (из-за меньшей разрядности), третий экземпляр надает с сообщением "недостаточно памяти", никто из экземпляров также оперативу не отдал.
Anonymous
Пробовал варианты как и с delete, так и с map = nil. Эффект тот же :(
Dmitry
не знаю насколько это правильно, но можно руками освобождать память debug.FreeOSMemory()
Anonymous
не знаю насколько это правильно, но можно руками освобождать память debug.FreeOSMemory()
Интересно. После вызова отдаёт около 250 Mb из 600, остальное не отдаёт.
Mike
Добро пожаловать в банковскую систему
Dmitry
странно что под Linux не сработало
Dmitry
As I understand, memory is returned to the OS about 5 minutes after is has been marked as free by the GC. And the GC runs every two minutes top, if not triggered by an increase in memory use. So worst-case would be 7 minutes to be freed. In this case, I think that the slice is not marked as freed, but in use, so it would never be returned to the OS.
Dmitry
а вот ещё пишут
Dmitry
что место освободится после 5 минут если оно помеченно как неиспользуемое