Go: Раскрытие потенциала скорости
Я всегда борюсь за скорость. Началось это все с того, как я прочитал книгу “Грокаем алгоритмы” и меня заинтересовало измерение скорости выполнения. Потом, решая задачи на LeetCode я расстраивался, если алгоритм получался медленным. Недавно мне пришла идея написать пост на эту тему, а во время написания изучить этот вопрос получше. Я прочитал не мало статьей, большинство из которых - англоязычные.Так что вот советы по увеличению скорости Вашего приложения на Golang :
1. Выделять ёмкость для среза с помощью make
При создании среза выделяйте ёмкость с помощью make, так Вы избавитесь от перераспределений
2. При возвращении указателя, объявлять его при создании переменной
func (r Ruleset) Match(path string) (*Rule, error) {
for i := len(r) - 1; i >= 0; i-- {
rule := r[i] //так НЕ надо
rule := &r[i] //так надо
match, err := rule.Match(path)
if match || err != nil {
return &rule, err //так НЕ надо
return rule, err //так надо
}
}
return nil, nil
}
3. Используйте for-loop
Вместо for i, v := range values
, используйте for i := 0; i < len(values); i++
. Вот бенчмарки:
BenchmarkForRange-4 443161 2371 ns/op
BenchmarkForLoop-4 1863501 641.7 ns/op
For-loop в несколько раз быстрее for-range
4. Пишите бенчмарки
Пишите бенчмарки для вашего приложения, так Вы поймете, в каком месте оно работает медленнее всего. Источник для того, чтобы научиться писать бенчмарки: https://dave.cheney.net/2013/06/30/how-to-write-benchmarks-in-go и др.