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
Надо смотреть.
Anonymous
Попробовал, вроде кушает все процы
Michael
Michael
Ivan
Ivan
в смысле может быть такое, но это будет работать неправильно)
Michael
мьютекс и атомик местами есть в методе Load
Valentin
Там два раза мапа хранится, одна с атомником только на чтения, вторая с мьютексом для записи
Сережа
у го точно потребление памяти меньше джавы?
А ВОТ ТЕПЕРЬ ПАБЛИК
Сережа
а может есть статья какая-нибудь? с графиками?
А ВОТ ТЕПЕРЬ ПАБЛИК
https://benchmarksgame.alioth.debian.org/u64q/go.html
А ВОТ ТЕПЕРЬ ПАБЛИК
смотри память
Сережа
спасибо, а не на числодробилках сравнение?
Сережа
а правда что gc не упаковывает память в го и она фрагментируется?
Сережа
а когда памяти не хватает просто берет у системы еще столько же, сколько уже выделенно
Сережа
ну там есть вроде переменная окружения
Сережа
по умолчанию 100%, т.е. столько сколько уже есть выделить
Anonymous
Я такого не встречал. Из проблем с памятью я только слыхал, что go не чистит мапы от удалённых элементов.
Anonymous
Попробовал, вроде кушает все процы
Мой итог тестов на коленке - mutex замедляет параллельную вставку в мапу в ~2.3 раза по сравнению с последовательной вставкой
Anonymous
Michael
экономика потребления
Сережа
и в виде компенсации заодно заказывает хозяину карты дилду в виде суслика
Anonymous
Anonymous
Только что попробовал на 1.8.3 - залил в мапу кучу элементов. Потом поочереди все удалил из мапы delete'ом. Оперативку обратно go не отдаёт.
Сережа
ладно, это придирки, все равно бинарник в контейнере наверное работает, а память выделяется на контейнер
Michael
Сережа
https://deferpanic.com/blog/understanding-golang-memory-usage/
Michael
Anonymous
Michael
ну это обычное поведение гц
Michael
также если система или что-то попросит памяти, то го гц уменшит размер резерва
Anonymous
Mike
Память есть? А если найду?
Michael
https://github.com/golang/go/issues/14521
Michael
статьи не нашёл
Michael
но там есть комментарии Чени и компании именно как это сделано в рантайме Гоу
Michael
Michael
а там как ОС решит
Michael
запусти один экземпляр своего приложения, удали все элементы мапы, отправь в сон приложение, запусти второй экземпляр и посмотри что будет происходить
Anonymous
Michael
второй будет кушать, первый будет добрым и поделится ресурсом
Anonymous
Ну вас нах
Michael
джава фан?
В
проверили? так и происходит?
Anonymous
проверили? так и происходит?
Windows 7 - система уходит в swap, оперативу не отдаёт ни один из экземпляров прог. Доберусь до дома, попробую в Linux...
Anton 🇺🇦
когда liteide x32 в релиз выложат?
Michael
Anonymous
покажешь код
примерно через полчасика покажу как тестирую
В
В
А еще "доверяй, но проверяй"
Сережа
А еще "зачем пачкать руки самому"
Mike
А еще, а еще...! ой, да ну вас =(
Anonymous
Каждый экземпляр проги ест ~600 Mb private bytes
Anonymous
Протестировал под Linux (ARM 32 bit, 1Gb RAM). Каждый экземпляр программы ~300 Mb (из-за меньшей разрядности), третий экземпляр надает с сообщением "недостаточно памяти", никто из экземпляров также оперативу не отдал.
Anonymous
Пробовал варианты как и с delete, так и с map = nil. Эффект тот же :(
Dmitry
не знаю насколько это правильно, но можно руками освобождать память debug.FreeOSMemory()
Anonymous
Mike
Добро пожаловать в банковскую систему
Dmitry
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 минут если оно помеченно как неиспользуемое