Оптимизация кода для улучшения результатов в golang GC, по-видимому, в последнее время является довольно важной вещью с оптимизированными по времени GC запусками. Недавно мне рассказали, сколько он выполнит в забеге «зависит от вашей модели использования памяти кучи». Но я не совсем уверен, что это означает/подразумевает с точки зрения программиста на этом языке. Или это не то, что можно легко контролировать?Как эффективно структурировать программу golang для оптимального запуска сборщиков мусора?
Я прочитал недавнюю книгу «Язык программирования Go» Брайана У. Кернигана, но в этом нет ничего об этом. И вся информация по этой теме в Интернете уже много лет назад, поэтому на самом деле не применяется.
Некоторые вещи, которые я в настоящее время делают включают:
- Удостоверяясь указатели/объекты только когда-либо сохранены/помнили, где они должны быть
- Выделение объектов с возможностями того, что, как ожидается, или в здравом уме
- Не дублирование данных
- Когда это возможно, используя потоковые данные через функции вместо того, чтобы помещать все данные в большую кучу спереди.
Меня также немного раздражает тот факт, что строки и байтовые массивы всегда воссоздаются при преобразовании между тем или другим (из-за неизменяемости строк). Поэтому, когда я перехожу от одного к другому и его безопасную операцию, я просто пересказываю свои указатели на другой тип, используя небезопасные.
Все ли эти методы стоят того, чтобы помочь GC работать быстрее и яснее? Есть ли что-нибудь еще, что я мог бы сделать?
Вы столкнулись с проблемой с GC? в первую очередь. проверьте http://blog.golang.org/profiling-go-programs – OneOfOne
Причина, по которой эта тема больше не обсуждается, заключается в том, что это действительно не так важно.Разумные методы программирования избегают подавляющего большинства проблем с GC, и если возникают проблемы, их легко обнаружить путем профилирования вашего кода. Использование небезопасного для качания указателя является ... чрезмерным. – Aedolon
Сначала я разбираюсь в профилировании, прежде чем тратить много времени на оптимизацию. Меня это беспокоит, хотя я не понимаю, как именно кодирование работает в фоновом режиме. Я знаю, что могу пойти посмотреть в исходном источнике, но это немного сложно. И это не значит, что чрезмерная IMO для написания MyFile.Write (S2B («Пример»)) в отличие от MyFile.Write ([] byte («Пример»)) - в которой S2B выполняет литье указателя, и нет лишнего выделение для строки, чтобы записать ее в файл. Для маленьких строк это NBD. Но когда у вас есть строка utf8 размером 10 МБ, которую вы просто хотите записать в файл, это имеет смысл. – Dakusan