Оптимизация производительности map

Если размер известен — задай начальную ёмкость через make:

// Без подсказки — многократное перехеширование при росте
m := make(map[string]int)

// С подсказкой — меньше аллокаций
m := make(map[string]int, 10000)

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

Стоимость хеширования зависит от типа ключа:

Тип ключаСтоимость хеширования
intминимальная
stringO(len)
structO(полей)
interfaceдополнительный boxing

Для горячих путей используй числовые ключи вместо строковых:

// Медленнее: хеширование строки
cache := map[string]*Result{}

// Быстрее: хеширование числа
type UserID uint64
cache := map[UserID]*Result{}
// Маленькие наборы (n < 10) — линейный поиск по срезу быстрее из-за кэша
type KV struct{ K, V string }
table := []KV{{"a", "1"}, {"b", "2"}}

// Счётчики с ограниченным диапазоном — массив
var freq [256]int
for _, c := range text { freq[c]++ }

// Битовый массив для наличия/отсутствия
var seen [1 << 16]bool
import "runtime"

var before, after runtime.MemStats
runtime.ReadMemStats(&before)
// ... операции с map ...
runtime.ReadMemStats(&after)
fmt.Println("allocs:", after.Mallocs-before.Mallocs)

Для бенчмарков используй testing.B:

func BenchmarkMap(b *testing.B) {
    m := make(map[int]int, b.N)
    for i := 0; i < b.N; i++ { m[i] = i }
}

ЗаданиеСложность
1Упражнение 1easy
2Упражнение 2easy
3Упражнение 3medium