Эта статья представляет собой резюме того, что я узнал из выступления Бьорна Рабенштейна на эту тему.

Вы можете посмотреть все видео ниже

# 1 Измеряйте все

Не оптимизируйте преждевременно. Всегда измеряйте все, чтобы определить правильные пути кода, которые нужно исправить.

Инструменты: go test, pprof, go-torch

# 2 Не позволяйте GC вас обмануть

Go GC больше не выполняет сценарии остановки мира, но по-прежнему выполняет работу в фоновом режиме, что может привести к небольшому времени паузы сборки мусора, но более высоким задержкам микросервисов.

# 3 Избегайте распределения

Кодируйте с осторожностью. Не перераспределяйте каждое значение в цикле. По возможности используйте буферы и sync.Pool вместо того, чтобы каждый раз создавать новый массив байтов.

# 4 Избегайте фрагментации кучи

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

Постарайтесь выделить как можно больше объектов фиксированного размера, а не произвольного размера. например байтовые массивы фиксированного размера



# 5 Не используйте Mutex

Мьютексы медленные (~ 100 нс на операцию)

Общайтесь, используя каналы, где можете, а не делитесь памятью. Используйте мьютекс только тогда, когда вам действительно нужна связь на низком уровне.

# 6 Используйте int в качестве ключей вместо строк в Map

Для каждого поиска и обновления необходимо вычислять хэш для строкового ключа, который не равен O (1) w.r.t. длина строки.

Следовательно, в качестве ключа лучше использовать int. Если вам действительно нужны строки, используйте более простой алгоритм хеширования (например, fnv64a), который может привести к большему количеству конфликтов хеширования, но обеспечит лучшую производительность в общих случаях.

# 7 Абстракции стоят дорого

Если вам действительно не нужна большая часть функций тяжелого интерфейса (например, Hash), вы можете кодировать свой интерфейс или использовать конкретные типы в функциях. Будет намного быстрее

✉️ Подпишитесь на рассылку еженедельно Email Blast 🐦 Подпишитесь на CodeBurst на Twitter , просмотрите 🗺️ План развития веб-разработчиков на 2018 год и 🕸️ Изучите веб-разработку с полным стеком .