2016-02-08 3 views
4

Оптимизация кода для улучшения результатов в golang GC, по-видимому, в последнее время является довольно важной вещью с оптимизированными по времени GC запусками. Недавно мне рассказали, сколько он выполнит в забеге «зависит от вашей модели использования памяти кучи». Но я не совсем уверен, что это означает/подразумевает с точки зрения программиста на этом языке. Или это не то, что можно легко контролировать?Как эффективно структурировать программу golang для оптимального запуска сборщиков мусора?

Я прочитал недавнюю книгу «Язык программирования Go» Брайана У. Кернигана, но в этом нет ничего об этом. И вся информация по этой теме в Интернете уже много лет назад, поэтому на самом деле не применяется.

Некоторые вещи, которые я в настоящее время делают включают:

  • Удостоверяясь указатели/объекты только когда-либо сохранены/помнили, где они должны быть
  • Выделение объектов с возможностями того, что, как ожидается, или в здравом уме
  • Не дублирование данных
  • Когда это возможно, используя потоковые данные через функции вместо того, чтобы помещать все данные в большую кучу спереди.

Меня также немного раздражает тот факт, что строки и байтовые массивы всегда воссоздаются при преобразовании между тем или другим (из-за неизменяемости строк). Поэтому, когда я перехожу от одного к другому и его безопасную операцию, я просто пересказываю свои указатели на другой тип, используя небезопасные.

Все ли эти методы стоят того, чтобы помочь GC работать быстрее и яснее? Есть ли что-нибудь еще, что я мог бы сделать?

+2

Вы столкнулись с проблемой с GC? в первую очередь. проверьте http://blog.golang.org/profiling-go-programs – OneOfOne

+1

Причина, по которой эта тема больше не обсуждается, заключается в том, что это действительно не так важно.Разумные методы программирования избегают подавляющего большинства проблем с GC, и если возникают проблемы, их легко обнаружить путем профилирования вашего кода. Использование небезопасного для качания указателя является ... чрезмерным. – Aedolon

+0

Сначала я разбираюсь в профилировании, прежде чем тратить много времени на оптимизацию. Меня это беспокоит, хотя я не понимаю, как именно кодирование работает в фоновом режиме. Я знаю, что могу пойти посмотреть в исходном источнике, но это немного сложно. И это не значит, что чрезмерная IMO для написания MyFile.Write (S2B («Пример»)) в отличие от MyFile.Write ([] byte («Пример»)) - в которой S2B выполняет литье указателя, и нет лишнего выделение для строки, чтобы записать ее в файл. Для маленьких строк это NBD. Но когда у вас есть строка utf8 размером 10 МБ, которую вы просто хотите записать в файл, это имеет смысл. – Dakusan

ответ

6

Если бы это было простое из списка дел и не было, мы могли бы просто написать программу для оптимизации использования памяти.

Первый шаг - написать правильный, хорошо продуманный, удобный и удобный для чтения код.

Далее, используя тестовый пакет Go, контрольные критические функции. Например. реальный случай,

BenchmarkOriginal  30000  44349 ns/op  52792 B/op  569 allocs/op 

Используйте инструмент профиля Go. Прочтите исходный код и исполняемый код, чтобы узнать, что происходит.

Реализовать стратегии, такие как единый базовый массив и полные выражения среза, чтобы уменьшить выделение памяти ГХ и время процессора. Запустите финальный тест.

BenchmarkOptimized 100000  13198 ns/op  32992 B/op  3 allocs/op 

В этом случае 569 распределения элементов треугольной матрицы были уменьшены до 3-х распределений, снижения на 99% в распределении с соответствующим уменьшением времени ЦП 70%. Для сборщика мусора (GC) намного меньше.

Конечно, это сделало код более трудным для чтения (более сложным и более неясным) и, следовательно, его было сложнее поддерживать.

Не переусердствуйте. Вам действительно нечего делать? Лучшая оптимизация часто покупает большой компьютер.

+0

Я не трачу много времени на оптимизацию. Я просто придерживаюсь лучших практик во время кодирования, поэтому мне не требуется дополнительное время. Мне просто нравится делать все правильно в первый раз, поэтому его не нужно переписывать позже. И хотя я не пишу код на уровне google/facebook, правильная оптимизация программного процесса может сократить количество серверов, необходимых для запуска чего-либо по величине. Просто 10% -ная оптимизация, когда у вас есть миллионы серверов, означает, что у вас есть 100 000 серверов, которые вы теперь можете использовать для расширения или использования в других местах. – Dakusan

+0

И я могу сказать, что вы уже знаете все это с уровнем вашей репутации, но пример реального мира случился со мной только в прошлом месяце. У меня был клиент потратил ~ 2000 долларов на серверные расходы, когда он мог потратить всего 20 долларов, если бы его программист правильно оптимизировал. – Dakusan

+0

Я должен не согласиться с покупкой большего компьютера, который «часто» является лучшей оптимизацией. Возьмите любой курс алгоритмов, и одна из первых вещей, которые вы услышите, - «часто хорошо разработанный алгоритм делает разницу между решением проблемы и неспособностью решить ее в разумные сроки, а не больше вычислительной мощности». – mass

Смежные вопросы