Я сравнил map + Mutex, map + RWMutex и sync.Map на Go 1.27.3. Сделал 5100 замеров на таблицах от одного до 10 млн ключей. Ниже 32 графика скорости и памяти, код тестов и выводы по разным нагрузкам.
Код и результаты можно скачать одним архивом . Скорость самого сервиса нужно измерять отдельно.
Что получилось При чтении 4096 ключей с 12 рабочими горутинами быстрее был SyncMap. Он показал 5,521 нс/оп. У RWMutex получилось 37,42, у Mutex 168,8 нс/оп.
При смеси 50/50 на одном ключе с 12 горутинами быстрее был RWMutex: 84,36 нс/оп. У Mutex получилось 171,2, у SyncMap 265,9 нс/оп.
Поэтому я бы проверял все три варианта. Для выбора нужны размер map, число горутин и доля записей. Ещё важно, как часто горутины обращаются к одним ключам.
Что сравниваем Первый вариант: обычная map с RWMutex. Читатели берут RLock, писатели Lock. Под блокировкой выполняется только поиск или запись в map:
type LockedMap struct {
mu sync .RWMutex
data map [uint64 ]* Value
}
type Value struct {
Number uint64
}
func (m * LockedMap ) Load (key uint64 ) (* Value , bool ) {
m .mu .RLock ()
v , ok := m .data [key ]
m .mu .RUnlock ()
return v , ok
}
func (m * LockedMap ) Store (key uint64 , v * Value ) {
m .mu .Lock ()
m .data [key ] = v
m .mu .Unlock ()
}
Второй вариант использует Mutex. Здесь и чтение, и запись берут Lock:
type MutexMap struct {
mu sync .Mutex
data map [uint64 ]* Value
}
func (m * MutexMap ) Load (key uint64 ) (* Value , bool ) {
m .mu .Lock ()
v , ok := m .data [key ]
m .mu .Unlock ()
return v , ok
}
func (m * MutexMap ) Store (key uint64 , v * Value ) {
m .mu .Lock ()
m .data [key ] = v
m .mu .Unlock ()
}
С Mutex читатели ждут друг друга. RWMutex разрешает им читать вместе, но сам тратит время на учёт читателей. Эти расходы тоже входят в замер. Правила описаны в документации Mutex и RWMutex .
В обоих примерах поле data нужно создать через make. Полный код есть в архиве. Основы разобрал в статье о map в Go .
Третий вариант использует sync.Map. Он принимает ключи через any. При чтении код приводит результат к *value. Эти шаги входят в замер. Обычные map хранят ключи и значения с заданными типами.
Значения в тесте хранятся в двух объектах. Каждый Store кладёт в map указатель на один из них. Поля объектов не меняются. Новый объект приложения на каждой записи создавать не нужно. Внутренние аллокации map входят в замер.
Как читать графики В тестах число рабочих горутин равно GOMAXPROCS. Дальше я обозначаю его буквой P. Например, P=12 означает 12 рабочих горутин и GOMAXPROCS=12.
Порядок в легендах и группах столбцов один: RWMutex, Mutex, SyncMap. Оба варианта с обычной map серые. RWMutex показан сплошной линией, Mutex короткими штрихами. SyncMap показан синим, с длинными штрихами. На столбчатых графиках у Mutex есть штриховка.
Каждая точка показывает медиану пяти повторов. Если упорядочить пять чисел, медиана будет третьим. Линия соединяет точки, которые я измерил.
На линейных графиках меньше нс/оп значит больше операций за секунду. Число взято из RunParallel: всё время замера делится на число итераций всех горутин. Например, 20 нс/оп дают около 50 млн итераций в секунду суммарно. Время ответа одного запроса по этому числу узнать нельзя. Подробности есть в документации RunParallel .
Пять коротких повторов дают лишь первый ориентир. Если линии близки, я бы увеличил время теста. Разницу в несколько процентов здесь легко спутать с шумом. Минимум и максимум каждого набора повторов лежат в summary.csv.
Чтение существующих ключей В map заранее лежат 4096 ключей. Горутины только читают их. Все поиски успешны.
У RWMutex читатели обновляют общий счётчик блокировки. Поэтому даже чтение без писателей имеет общие расходы.
0 50 100 150 200 нс/оп 1 2 3 4 6 8 12 Исполнителей (GOMAXPROCS) RWMutex Mutex SyncMap RWMutex, Исполнителей (GOMAXPROCS): 1, 20.2 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 2, 41.47 нс/оп 41.47 RWMutex, Исполнителей (GOMAXPROCS): 3, 44.11 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 4, 46.67 нс/оп 46.67 RWMutex, Исполнителей (GOMAXPROCS): 6, 48.36 нс/оп 48.36 RWMutex, Исполнителей (GOMAXPROCS): 8, 42.29 нс/оп 42.29 RWMutex, Исполнителей (GOMAXPROCS): 12, 37.42 нс/оп 37.42 Mutex, Исполнителей (GOMAXPROCS): 1, 17.69 нс/оп Mutex, Исполнителей (GOMAXPROCS): 2, 41.84 нс/оп Mutex, Исполнителей (GOMAXPROCS): 3, 64.13 нс/оп 64.13 Mutex, Исполнителей (GOMAXPROCS): 4, 77.45 нс/оп 77.45 Mutex, Исполнителей (GOMAXPROCS): 6, 128.5 нс/оп 128.5 Mutex, Исполнителей (GOMAXPROCS): 8, 170.5 нс/оп 170.5 Mutex, Исполнителей (GOMAXPROCS): 12, 168.8 нс/оп 168.8 SyncMap, Исполнителей (GOMAXPROCS): 1, 45.52 нс/оп 45.52 SyncMap, Исполнителей (GOMAXPROCS): 2, 21.7 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 3, 14.24 нс/оп 14.24 SyncMap, Исполнителей (GOMAXPROCS): 4, 10.28 нс/оп 10.28 SyncMap, Исполнителей (GOMAXPROCS): 6, 7.54 нс/оп 7.54 SyncMap, Исполнителей (GOMAXPROCS): 8, 6.56 нс/оп 6.56 SyncMap, Исполнителей (GOMAXPROCS): 12, 5.52 нс/оп 5.52 0 50 100 150 200 нс/оп 1 3 6 8 12 Исполнителей (GOMAXPROCS) RWMutex Mutex SyncMap RWMutex, Исполнителей (GOMAXPROCS): 1, 20.2 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 2, 41.47 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 3, 44.11 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 4, 46.67 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 6, 48.36 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 8, 42.29 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 12, 37.42 нс/оп Mutex, Исполнителей (GOMAXPROCS): 1, 17.69 нс/оп Mutex, Исполнителей (GOMAXPROCS): 2, 41.84 нс/оп Mutex, Исполнителей (GOMAXPROCS): 3, 64.13 нс/оп Mutex, Исполнителей (GOMAXPROCS): 4, 77.45 нс/оп Mutex, Исполнителей (GOMAXPROCS): 6, 128.5 нс/оп Mutex, Исполнителей (GOMAXPROCS): 8, 170.5 нс/оп Mutex, Исполнителей (GOMAXPROCS): 12, 168.8 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 1, 45.52 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 2, 21.7 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 3, 14.24 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 4, 10.28 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 6, 7.54 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 8, 6.56 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 12, 5.52 нс/оп Чтение без записей, 4096 ключей; медиана пяти повторов, меньше лучше При P=1 у Mutex получилось 17,69 нс/оп, у RWMutex 20,2, у SyncMap 45,52. При P=12 порядок сменился: SyncMap 5,521, RWMutex 37,42, Mutex 168,8 нс/оп.
Один процент записей На каждом шаге вероятность Store равна 1%. Запись меняет значение у готового ключа. Таблица не растёт. Ключи и значения уже есть в памяти.
0 50 100 150 200 нс/оп 1 2 3 4 6 8 12 Исполнителей (GOMAXPROCS) RWMutex Mutex SyncMap RWMutex, Исполнителей (GOMAXPROCS): 1, 20.29 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 2, 74.59 нс/оп 74.59 RWMutex, Исполнителей (GOMAXPROCS): 3, 80.15 нс/оп 80.15 RWMutex, Исполнителей (GOMAXPROCS): 4, 104.2 нс/оп 104.2 RWMutex, Исполнителей (GOMAXPROCS): 6, 125.0 нс/оп 125.0 RWMutex, Исполнителей (GOMAXPROCS): 8, 137.1 нс/оп 137.1 RWMutex, Исполнителей (GOMAXPROCS): 12, 147.9 нс/оп 147.9 Mutex, Исполнителей (GOMAXPROCS): 1, 20.84 нс/оп Mutex, Исполнителей (GOMAXPROCS): 2, 42.79 нс/оп 42.79 Mutex, Исполнителей (GOMAXPROCS): 3, 67.28 нс/оп 67.28 Mutex, Исполнителей (GOMAXPROCS): 4, 87.45 нс/оп 87.45 Mutex, Исполнителей (GOMAXPROCS): 6, 166.3 нс/оп 166.3 Mutex, Исполнителей (GOMAXPROCS): 8, 173.1 нс/оп 173.1 Mutex, Исполнителей (GOMAXPROCS): 12, 175.4 нс/оп 175.4 SyncMap, Исполнителей (GOMAXPROCS): 1, 51.37 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 2, 26.53 нс/оп 26.53 SyncMap, Исполнителей (GOMAXPROCS): 3, 16.56 нс/оп 16.56 SyncMap, Исполнителей (GOMAXPROCS): 4, 12.51 нс/оп 12.51 SyncMap, Исполнителей (GOMAXPROCS): 6, 8.92 нс/оп 8.92 SyncMap, Исполнителей (GOMAXPROCS): 8, 7.84 нс/оп 7.84 SyncMap, Исполнителей (GOMAXPROCS): 12, 6.84 нс/оп 6.84 0 50 100 150 200 нс/оп 1 3 6 8 12 Исполнителей (GOMAXPROCS) RWMutex Mutex SyncMap RWMutex, Исполнителей (GOMAXPROCS): 1, 20.29 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 2, 74.59 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 3, 80.15 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 4, 104.2 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 6, 125.0 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 8, 137.1 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 12, 147.9 нс/оп Mutex, Исполнителей (GOMAXPROCS): 1, 20.84 нс/оп Mutex, Исполнителей (GOMAXPROCS): 2, 42.79 нс/оп Mutex, Исполнителей (GOMAXPROCS): 3, 67.28 нс/оп Mutex, Исполнителей (GOMAXPROCS): 4, 87.45 нс/оп Mutex, Исполнителей (GOMAXPROCS): 6, 166.3 нс/оп Mutex, Исполнителей (GOMAXPROCS): 8, 173.1 нс/оп Mutex, Исполнителей (GOMAXPROCS): 12, 175.4 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 1, 51.37 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 2, 26.53 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 3, 16.56 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 4, 12.51 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 6, 8.92 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 8, 7.84 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 12, 6.84 нс/оп 99% Load и 1% Store, 4096 ключей; медиана пяти повторов, меньше лучше Десять процентов записей Теперь вероятность записи равна 10%. Остальные обращения читают map. Общая блокировка нужна даже тогда, когда горутины выбрали разные ключи.
0 100 200 300 нс/оп 1 2 3 4 6 8 12 Исполнителей (GOMAXPROCS) RWMutex Mutex SyncMap RWMutex, Исполнителей (GOMAXPROCS): 1, 22.68 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 2, 85.99 нс/оп 85.99 RWMutex, Исполнителей (GOMAXPROCS): 3, 109.8 нс/оп 109.8 RWMutex, Исполнителей (GOMAXPROCS): 4, 116.3 нс/оп 116.3 RWMutex, Исполнителей (GOMAXPROCS): 6, 114.4 нс/оп 114.4 RWMutex, Исполнителей (GOMAXPROCS): 8, 122.4 нс/оп 122.4 RWMutex, Исполнителей (GOMAXPROCS): 12, 113.5 нс/оп 113.5 Mutex, Исполнителей (GOMAXPROCS): 1, 22.29 нс/оп Mutex, Исполнителей (GOMAXPROCS): 2, 75.63 нс/оп Mutex, Исполнителей (GOMAXPROCS): 3, 84.7 нс/оп 84.7 Mutex, Исполнителей (GOMAXPROCS): 4, 118.0 нс/оп 118.0 Mutex, Исполнителей (GOMAXPROCS): 6, 183.8 нс/оп 183.8 Mutex, Исполнителей (GOMAXPROCS): 8, 211.7 нс/оп 211.7 Mutex, Исполнителей (GOMAXPROCS): 12, 209.4 нс/оп 209.4 SyncMap, Исполнителей (GOMAXPROCS): 1, 53.09 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 2, 40.46 нс/оп 40.46 SyncMap, Исполнителей (GOMAXPROCS): 3, 27.38 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 4, 20.12 нс/оп 20.12 SyncMap, Исполнителей (GOMAXPROCS): 6, 14.5 нс/оп 14.5 SyncMap, Исполнителей (GOMAXPROCS): 8, 12.52 нс/оп 12.52 SyncMap, Исполнителей (GOMAXPROCS): 12, 11.56 нс/оп 11.56 0 100 200 300 нс/оп 1 3 6 8 12 Исполнителей (GOMAXPROCS) RWMutex Mutex SyncMap RWMutex, Исполнителей (GOMAXPROCS): 1, 22.68 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 2, 85.99 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 3, 109.8 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 4, 116.3 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 6, 114.4 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 8, 122.4 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 12, 113.5 нс/оп Mutex, Исполнителей (GOMAXPROCS): 1, 22.29 нс/оп Mutex, Исполнителей (GOMAXPROCS): 2, 75.63 нс/оп Mutex, Исполнителей (GOMAXPROCS): 3, 84.7 нс/оп Mutex, Исполнителей (GOMAXPROCS): 4, 118.0 нс/оп Mutex, Исполнителей (GOMAXPROCS): 6, 183.8 нс/оп Mutex, Исполнителей (GOMAXPROCS): 8, 211.7 нс/оп Mutex, Исполнителей (GOMAXPROCS): 12, 209.4 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 1, 53.09 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 2, 40.46 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 3, 27.38 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 4, 20.12 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 6, 14.5 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 8, 12.52 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 12, 11.56 нс/оп 90% Load и 10% Store, 4096 ключей; медиана пяти повторов, меньше лучше При P=1 у Mutex и RWMutex получились близкие числа: 22,29 и 22,68 нс/оп. У SyncMap 53,09. При P=12 у Mutex уже 209,4, у RWMutex 113,5, у SyncMap 11,56 нс/оп.
Половина операций записывает Чтение и запись выбираются с равной вероятностью. Под блокировкой по-прежнему выполняется только обращение к map. Походов в сеть или базу здесь нет.
0 100 200 300 400 нс/оп 1 2 3 4 6 8 12 Исполнителей (GOMAXPROCS) RWMutex Mutex SyncMap RWMutex, Исполнителей (GOMAXPROCS): 1, 30.7 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 2, 126.0 нс/оп 126.0 RWMutex, Исполнителей (GOMAXPROCS): 3, 157.9 нс/оп 157.9 RWMutex, Исполнителей (GOMAXPROCS): 4, 162.2 нс/оп 162.2 RWMutex, Исполнителей (GOMAXPROCS): 6, 161.8 нс/оп 161.8 RWMutex, Исполнителей (GOMAXPROCS): 8, 155.0 нс/оп 155.0 RWMutex, Исполнителей (GOMAXPROCS): 12, 158.2 нс/оп 158.2 Mutex, Исполнителей (GOMAXPROCS): 1, 24.5 нс/оп Mutex, Исполнителей (GOMAXPROCS): 2, 100.8 нс/оп 100.8 Mutex, Исполнителей (GOMAXPROCS): 3, 127.9 нс/оп 127.9 Mutex, Исполнителей (GOMAXPROCS): 4, 217.1 нс/оп 217.1 Mutex, Исполнителей (GOMAXPROCS): 6, 241.9 нс/оп 241.9 Mutex, Исполнителей (GOMAXPROCS): 8, 275.1 нс/оп 275.1 Mutex, Исполнителей (GOMAXPROCS): 12, 305.1 нс/оп 305.1 SyncMap, Исполнителей (GOMAXPROCS): 1, 83.8 нс/оп 83.8 SyncMap, Исполнителей (GOMAXPROCS): 2, 93.4 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 3, 61.61 нс/оп 61.61 SyncMap, Исполнителей (GOMAXPROCS): 4, 45.81 нс/оп 45.81 SyncMap, Исполнителей (GOMAXPROCS): 6, 33.82 нс/оп 33.82 SyncMap, Исполнителей (GOMAXPROCS): 8, 29.55 нс/оп 29.55 SyncMap, Исполнителей (GOMAXPROCS): 12, 29.93 нс/оп 29.93 0 100 200 300 400 нс/оп 1 3 6 8 12 Исполнителей (GOMAXPROCS) RWMutex Mutex SyncMap RWMutex, Исполнителей (GOMAXPROCS): 1, 30.7 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 2, 126.0 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 3, 157.9 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 4, 162.2 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 6, 161.8 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 8, 155.0 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 12, 158.2 нс/оп Mutex, Исполнителей (GOMAXPROCS): 1, 24.5 нс/оп Mutex, Исполнителей (GOMAXPROCS): 2, 100.8 нс/оп Mutex, Исполнителей (GOMAXPROCS): 3, 127.9 нс/оп Mutex, Исполнителей (GOMAXPROCS): 4, 217.1 нс/оп Mutex, Исполнителей (GOMAXPROCS): 6, 241.9 нс/оп Mutex, Исполнителей (GOMAXPROCS): 8, 275.1 нс/оп Mutex, Исполнителей (GOMAXPROCS): 12, 305.1 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 1, 83.8 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 2, 93.4 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 3, 61.61 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 4, 45.81 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 6, 33.82 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 8, 29.55 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 12, 29.93 нс/оп 50% Load и 50% Store, 4096 ключей; медиана пяти повторов, меньше лучше Только перезапись Каждый шаг вызывает Store. Ключ уже есть в map, меняется только указатель на значение. RWMutex работает через Lock, как и обычный Mutex.
0 100 200 300 400 нс/оп 1 2 3 4 6 8 12 Исполнителей (GOMAXPROCS) RWMutex Mutex SyncMap RWMutex, Исполнителей (GOMAXPROCS): 1, 30.77 нс/оп 30.77 RWMutex, Исполнителей (GOMAXPROCS): 2, 118.7 нс/оп 118.7 RWMutex, Исполнителей (GOMAXPROCS): 3, 174.5 нс/оп 174.5 RWMutex, Исполнителей (GOMAXPROCS): 4, 260.3 нс/оп 260.3 RWMutex, Исполнителей (GOMAXPROCS): 6, 280.8 нс/оп 280.8 RWMutex, Исполнителей (GOMAXPROCS): 8, 344.1 нс/оп 344.1 RWMutex, Исполнителей (GOMAXPROCS): 12, 347.5 нс/оп 347.5 Mutex, Исполнителей (GOMAXPROCS): 1, 20.29 нс/оп Mutex, Исполнителей (GOMAXPROCS): 2, 95.9 нс/оп Mutex, Исполнителей (GOMAXPROCS): 3, 149.2 нс/оп Mutex, Исполнителей (GOMAXPROCS): 4, 181.8 нс/оп 181.8 Mutex, Исполнителей (GOMAXPROCS): 6, 248.3 нс/оп 248.3 Mutex, Исполнителей (GOMAXPROCS): 8, 304.9 нс/оп 304.9 Mutex, Исполнителей (GOMAXPROCS): 12, 321.0 нс/оп 321.0 SyncMap, Исполнителей (GOMAXPROCS): 1, 135.5 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 2, 136.9 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 3, 88.62 нс/оп 88.62 SyncMap, Исполнителей (GOMAXPROCS): 4, 65.3 нс/оп 65.3 SyncMap, Исполнителей (GOMAXPROCS): 6, 50.03 нс/оп 50.03 SyncMap, Исполнителей (GOMAXPROCS): 8, 46.68 нс/оп 46.68 SyncMap, Исполнителей (GOMAXPROCS): 12, 47.76 нс/оп 47.76 0 100 200 300 400 нс/оп 1 3 6 8 12 Исполнителей (GOMAXPROCS) RWMutex Mutex SyncMap RWMutex, Исполнителей (GOMAXPROCS): 1, 30.77 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 2, 118.7 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 3, 174.5 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 4, 260.3 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 6, 280.8 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 8, 344.1 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 12, 347.5 нс/оп Mutex, Исполнителей (GOMAXPROCS): 1, 20.29 нс/оп Mutex, Исполнителей (GOMAXPROCS): 2, 95.9 нс/оп Mutex, Исполнителей (GOMAXPROCS): 3, 149.2 нс/оп Mutex, Исполнителей (GOMAXPROCS): 4, 181.8 нс/оп Mutex, Исполнителей (GOMAXPROCS): 6, 248.3 нс/оп Mutex, Исполнителей (GOMAXPROCS): 8, 304.9 нс/оп Mutex, Исполнителей (GOMAXPROCS): 12, 321.0 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 1, 135.5 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 2, 136.9 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 3, 88.62 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 4, 65.3 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 6, 50.03 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 8, 46.68 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 12, 47.76 нс/оп 100% Store существующих ключей, 4096 ключей; медиана пяти повторов, меньше лучше При P=12 Mutex показал 321 нс/оп, RWMutex 347,5, SyncMap 47,76. Ниже я проверяю перезапись и на других размерах map.
Чтение отсутствующих ключей В map лежат 4096 ключей. Горутины ищут ключи из другого диапазона и всегда получают промах. После промаха тест ничего не загружает и не добавляет в map.
0 50 100 150 200 нс/оп 1 2 3 4 6 8 12 Исполнителей (GOMAXPROCS) RWMutex Mutex SyncMap RWMutex, Исполнителей (GOMAXPROCS): 1, 18.54 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 2, 33.49 нс/оп 33.49 RWMutex, Исполнителей (GOMAXPROCS): 3, 45.01 нс/оп 45.01 RWMutex, Исполнителей (GOMAXPROCS): 4, 55.46 нс/оп 55.46 RWMutex, Исполнителей (GOMAXPROCS): 6, 48.58 нс/оп 48.58 RWMutex, Исполнителей (GOMAXPROCS): 8, 43.38 нс/оп 43.38 RWMutex, Исполнителей (GOMAXPROCS): 12, 36.44 нс/оп 36.44 Mutex, Исполнителей (GOMAXPROCS): 1, 19.39 нс/оп Mutex, Исполнителей (GOMAXPROCS): 2, 34.16 нс/оп Mutex, Исполнителей (GOMAXPROCS): 3, 60.41 нс/оп 60.41 Mutex, Исполнителей (GOMAXPROCS): 4, 66.82 нс/оп 66.82 Mutex, Исполнителей (GOMAXPROCS): 6, 131.7 нс/оп 131.7 Mutex, Исполнителей (GOMAXPROCS): 8, 150.3 нс/оп 150.3 Mutex, Исполнителей (GOMAXPROCS): 12, 172.4 нс/оп 172.4 SyncMap, Исполнителей (GOMAXPROCS): 1, 35.49 нс/оп 35.49 SyncMap, Исполнителей (GOMAXPROCS): 2, 19.65 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 3, 11.89 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 4, 8.73 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 6, 6.38 нс/оп 6.38 SyncMap, Исполнителей (GOMAXPROCS): 8, 5.53 нс/оп 5.53 SyncMap, Исполнителей (GOMAXPROCS): 12, 4.52 нс/оп 4.52 0 50 100 150 200 нс/оп 1 3 6 8 12 Исполнителей (GOMAXPROCS) RWMutex Mutex SyncMap RWMutex, Исполнителей (GOMAXPROCS): 1, 18.54 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 2, 33.49 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 3, 45.01 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 4, 55.46 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 6, 48.58 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 8, 43.38 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 12, 36.44 нс/оп Mutex, Исполнителей (GOMAXPROCS): 1, 19.39 нс/оп Mutex, Исполнителей (GOMAXPROCS): 2, 34.16 нс/оп Mutex, Исполнителей (GOMAXPROCS): 3, 60.41 нс/оп Mutex, Исполнителей (GOMAXPROCS): 4, 66.82 нс/оп Mutex, Исполнителей (GOMAXPROCS): 6, 131.7 нс/оп Mutex, Исполнителей (GOMAXPROCS): 8, 150.3 нс/оп Mutex, Исполнителей (GOMAXPROCS): 12, 172.4 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 1, 35.49 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 2, 19.65 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 3, 11.89 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 4, 8.73 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 6, 6.38 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 8, 5.53 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 12, 4.52 нс/оп 100% Load отсутствующих ключей; медиана пяти повторов, меньше лучше Удаление и повторная вставка Горутина удаляет случайный ключ и вставляет его обратно. В одном шаге два вызова : Delete и Store. Между ними может сработать другая горутина. К моменту удаления ключ уже может отсутствовать.
У Mutex и RWMutex это два отдельных захвата блокировки. Поэтому сравнивать число с тестом одного Store напрямую нельзя. Число ключей здесь колеблется, но не растёт без конца.
0 200 400 600 800 нс/оп 1 2 3 4 6 8 12 Исполнителей (GOMAXPROCS) RWMutex Mutex SyncMap RWMutex, Исполнителей (GOMAXPROCS): 1, 71.69 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 2, 293.1 нс/оп 293.1 RWMutex, Исполнителей (GOMAXPROCS): 3, 304.6 нс/оп 304.6 RWMutex, Исполнителей (GOMAXPROCS): 4, 481.2 нс/оп 481.2 RWMutex, Исполнителей (GOMAXPROCS): 6, 539.9 нс/оп 539.9 RWMutex, Исполнителей (GOMAXPROCS): 8, 616.6 нс/оп 616.6 RWMutex, Исполнителей (GOMAXPROCS): 12, 755.9 нс/оп 755.9 Mutex, Исполнителей (GOMAXPROCS): 1, 62.68 нс/оп Mutex, Исполнителей (GOMAXPROCS): 2, 216.2 нс/оп 216.2 Mutex, Исполнителей (GOMAXPROCS): 3, 313.6 нс/оп 313.6 Mutex, Исполнителей (GOMAXPROCS): 4, 375.7 нс/оп 375.7 Mutex, Исполнителей (GOMAXPROCS): 6, 517.8 нс/оп 517.8 Mutex, Исполнителей (GOMAXPROCS): 8, 511.8 нс/оп 511.8 Mutex, Исполнителей (GOMAXPROCS): 12, 615.8 нс/оп 615.8 SyncMap, Исполнителей (GOMAXPROCS): 1, 165.7 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 2, 170.7 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 3, 108.8 нс/оп 108.8 SyncMap, Исполнителей (GOMAXPROCS): 4, 80.77 нс/оп 80.77 SyncMap, Исполнителей (GOMAXPROCS): 6, 61.73 нс/оп 61.73 SyncMap, Исполнителей (GOMAXPROCS): 8, 54.8 нс/оп 54.8 SyncMap, Исполнителей (GOMAXPROCS): 12, 55.65 нс/оп 55.65 0 200 400 600 800 нс/оп 1 3 6 8 12 Исполнителей (GOMAXPROCS) RWMutex Mutex SyncMap RWMutex, Исполнителей (GOMAXPROCS): 1, 71.69 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 2, 293.1 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 3, 304.6 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 4, 481.2 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 6, 539.9 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 8, 616.6 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 12, 755.9 нс/оп Mutex, Исполнителей (GOMAXPROCS): 1, 62.68 нс/оп Mutex, Исполнителей (GOMAXPROCS): 2, 216.2 нс/оп Mutex, Исполнителей (GOMAXPROCS): 3, 313.6 нс/оп Mutex, Исполнителей (GOMAXPROCS): 4, 375.7 нс/оп Mutex, Исполнителей (GOMAXPROCS): 6, 517.8 нс/оп Mutex, Исполнителей (GOMAXPROCS): 8, 511.8 нс/оп Mutex, Исполнителей (GOMAXPROCS): 12, 615.8 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 1, 165.7 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 2, 170.7 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 3, 108.8 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 4, 80.77 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 6, 61.73 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 8, 54.8 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 12, 55.65 нс/оп Одна итерация Delete + Store, 4096 возможных ключей; медиана пяти повторов, меньше лучше Каждой горутине свой набор ключей У каждой горутины свой набор ключей. Map и блокировка остаются общими. И Mutex, и RWMutex по-прежнему защищают всю таблицу.
На горутину приходится 4096 ключей. При P=1 их всего 4096, при P=12 уже 49152. Значит, вместе с числом горутин растёт и таблица. Этот график показывает оба эффекта сразу.
0 100 200 300 400 нс/оп 1 2 3 4 6 8 12 Исполнителей (GOMAXPROCS) RWMutex Mutex SyncMap RWMutex, Исполнителей (GOMAXPROCS): 1, 30.96 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 2, 128.2 нс/оп 128.2 RWMutex, Исполнителей (GOMAXPROCS): 3, 173.2 нс/оп 173.2 RWMutex, Исполнителей (GOMAXPROCS): 4, 169.5 нс/оп 169.5 RWMutex, Исполнителей (GOMAXPROCS): 6, 188.6 нс/оп 188.6 RWMutex, Исполнителей (GOMAXPROCS): 8, 174.9 нс/оп 174.9 RWMutex, Исполнителей (GOMAXPROCS): 12, 199.6 нс/оп 199.6 Mutex, Исполнителей (GOMAXPROCS): 1, 29.12 нс/оп Mutex, Исполнителей (GOMAXPROCS): 2, 74.2 нс/оп 74.2 Mutex, Исполнителей (GOMAXPROCS): 3, 151.4 нс/оп 151.4 Mutex, Исполнителей (GOMAXPROCS): 4, 211.7 нс/оп 211.7 Mutex, Исполнителей (GOMAXPROCS): 6, 269.5 нс/оп 269.5 Mutex, Исполнителей (GOMAXPROCS): 8, 270.4 нс/оп 270.4 Mutex, Исполнителей (GOMAXPROCS): 12, 341.3 нс/оп 341.3 SyncMap, Исполнителей (GOMAXPROCS): 1, 91.76 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 2, 87.92 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 3, 55.36 нс/оп 55.36 SyncMap, Исполнителей (GOMAXPROCS): 4, 46.34 нс/оп 46.34 SyncMap, Исполнителей (GOMAXPROCS): 6, 35.51 нс/оп 35.51 SyncMap, Исполнителей (GOMAXPROCS): 8, 32.38 нс/оп 32.38 SyncMap, Исполнителей (GOMAXPROCS): 12, 31.81 нс/оп 31.81 0 100 200 300 400 нс/оп 1 3 6 8 12 Исполнителей (GOMAXPROCS) RWMutex Mutex SyncMap RWMutex, Исполнителей (GOMAXPROCS): 1, 30.96 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 2, 128.2 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 3, 173.2 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 4, 169.5 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 6, 188.6 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 8, 174.9 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 12, 199.6 нс/оп Mutex, Исполнителей (GOMAXPROCS): 1, 29.12 нс/оп Mutex, Исполнителей (GOMAXPROCS): 2, 74.2 нс/оп Mutex, Исполнителей (GOMAXPROCS): 3, 151.4 нс/оп Mutex, Исполнителей (GOMAXPROCS): 4, 211.7 нс/оп Mutex, Исполнителей (GOMAXPROCS): 6, 269.5 нс/оп Mutex, Исполнителей (GOMAXPROCS): 8, 270.4 нс/оп Mutex, Исполнителей (GOMAXPROCS): 12, 341.3 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 1, 91.76 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 2, 87.92 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 3, 55.36 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 4, 46.34 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 6, 35.51 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 8, 32.38 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 12, 31.81 нс/оп 50% Store, непересекающиеся наборы по 4096 ключей; медиана пяти повторов, меньше лучше LoadOrStore: ключ уже есть Все ключи уже лежат в map. Метод LoadOrStore всегда возвращает готовое значение.
У обычных map поиск идёт под Lock. У RWMutex можно сделать иначе: сначала проверить ключ под RLock. Если его нет, взять Lock и проверить ещё раз. Такой вариант здесь не измерялся.
0 100 200 300 нс/оп 1 2 3 4 6 8 12 Исполнителей (GOMAXPROCS) RWMutex Mutex SyncMap RWMutex, Исполнителей (GOMAXPROCS): 1, 32.03 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 2, 91.65 нс/оп 91.65 RWMutex, Исполнителей (GOMAXPROCS): 3, 91.0 нс/оп 91.0 RWMutex, Исполнителей (GOMAXPROCS): 4, 160.3 нс/оп 160.3 RWMutex, Исполнителей (GOMAXPROCS): 6, 206.5 нс/оп 206.5 RWMutex, Исполнителей (GOMAXPROCS): 8, 234.3 нс/оп 234.3 RWMutex, Исполнителей (GOMAXPROCS): 12, 248.9 нс/оп 248.9 Mutex, Исполнителей (GOMAXPROCS): 1, 23.96 нс/оп Mutex, Исполнителей (GOMAXPROCS): 2, 37.05 нс/оп 37.05 Mutex, Исполнителей (GOMAXPROCS): 3, 62.95 нс/оп Mutex, Исполнителей (GOMAXPROCS): 4, 70.92 нс/оп 70.92 Mutex, Исполнителей (GOMAXPROCS): 6, 168.6 нс/оп 168.6 Mutex, Исполнителей (GOMAXPROCS): 8, 181.2 нс/оп 181.2 Mutex, Исполнителей (GOMAXPROCS): 12, 192.8 нс/оп 192.8 SyncMap, Исполнителей (GOMAXPROCS): 1, 66.66 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 2, 30.25 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 3, 20.2 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 4, 14.71 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 6, 11.3 нс/оп 11.3 SyncMap, Исполнителей (GOMAXPROCS): 8, 10.47 нс/оп 10.47 SyncMap, Исполнителей (GOMAXPROCS): 12, 10.86 нс/оп 10.86 0 100 200 300 нс/оп 1 3 6 8 12 Исполнителей (GOMAXPROCS) RWMutex Mutex SyncMap RWMutex, Исполнителей (GOMAXPROCS): 1, 32.03 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 2, 91.65 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 3, 91.0 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 4, 160.3 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 6, 206.5 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 8, 234.3 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 12, 248.9 нс/оп Mutex, Исполнителей (GOMAXPROCS): 1, 23.96 нс/оп Mutex, Исполнителей (GOMAXPROCS): 2, 37.05 нс/оп Mutex, Исполнителей (GOMAXPROCS): 3, 62.95 нс/оп Mutex, Исполнителей (GOMAXPROCS): 4, 70.92 нс/оп Mutex, Исполнителей (GOMAXPROCS): 6, 168.6 нс/оп Mutex, Исполнителей (GOMAXPROCS): 8, 181.2 нс/оп Mutex, Исполнителей (GOMAXPROCS): 12, 192.8 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 1, 66.66 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 2, 30.25 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 3, 20.2 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 4, 14.71 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 6, 11.3 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 8, 10.47 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 12, 10.86 нс/оп LoadOrStore: ключ всегда существует; медиана пяти повторов, меньше лучше Как влияет доля записей Оставляем 4096 ключей и P=12. Меняем только шанс записи: от 1% до 100%. По графику можно выбрать долю записей и сравнить все три варианта в одной точке.
0 100 200 300 400 нс/оп 1 10 20 40 60 80 90 100 Записей, % RWMutex Mutex SyncMap RWMutex, Записей, %: 1, 148.8 нс/оп RWMutex, Записей, %: 2, 173.0 нс/оп RWMutex, Записей, %: 5, 168.5 нс/оп RWMutex, Записей, %: 10, 130.2 нс/оп RWMutex, Записей, %: 20, 122.1 нс/оп RWMutex, Записей, %: 40, 151.5 нс/оп RWMutex, Записей, %: 60, 156.2 нс/оп RWMutex, Записей, %: 80, 183.7 нс/оп RWMutex, Записей, %: 90, 210.0 нс/оп RWMutex, Записей, %: 99, 354.2 нс/оп RWMutex, Записей, %: 100, 393.9 нс/оп Mutex, Записей, %: 1, 184.0 нс/оп Mutex, Записей, %: 2, 181.3 нс/оп Mutex, Записей, %: 5, 206.1 нс/оп Mutex, Записей, %: 10, 221.2 нс/оп Mutex, Записей, %: 20, 237.9 нс/оп Mutex, Записей, %: 40, 288.5 нс/оп Mutex, Записей, %: 60, 310.9 нс/оп Mutex, Записей, %: 80, 326.6 нс/оп Mutex, Записей, %: 90, 311.9 нс/оп Mutex, Записей, %: 99, 296.9 нс/оп Mutex, Записей, %: 100, 318.6 нс/оп SyncMap, Записей, %: 1, 6.58 нс/оп SyncMap, Записей, %: 2, 7.14 нс/оп SyncMap, Записей, %: 5, 9.26 нс/оп SyncMap, Записей, %: 10, 12.08 нс/оп SyncMap, Записей, %: 20, 16.54 нс/оп SyncMap, Записей, %: 40, 25.7 нс/оп SyncMap, Записей, %: 60, 34.77 нс/оп SyncMap, Записей, %: 80, 41.74 нс/оп SyncMap, Записей, %: 90, 45.47 нс/оп SyncMap, Записей, %: 99, 48.88 нс/оп SyncMap, Записей, %: 100, 48.82 нс/оп 0 100 200 300 400 нс/оп 1 20 40 60 80 100 Записей, % RWMutex Mutex SyncMap RWMutex, Записей, %: 1, 148.8 нс/оп RWMutex, Записей, %: 2, 173.0 нс/оп RWMutex, Записей, %: 5, 168.5 нс/оп RWMutex, Записей, %: 10, 130.2 нс/оп RWMutex, Записей, %: 20, 122.1 нс/оп RWMutex, Записей, %: 40, 151.5 нс/оп RWMutex, Записей, %: 60, 156.2 нс/оп RWMutex, Записей, %: 80, 183.7 нс/оп RWMutex, Записей, %: 90, 210.0 нс/оп RWMutex, Записей, %: 99, 354.2 нс/оп RWMutex, Записей, %: 100, 393.9 нс/оп Mutex, Записей, %: 1, 184.0 нс/оп Mutex, Записей, %: 2, 181.3 нс/оп Mutex, Записей, %: 5, 206.1 нс/оп Mutex, Записей, %: 10, 221.2 нс/оп Mutex, Записей, %: 20, 237.9 нс/оп Mutex, Записей, %: 40, 288.5 нс/оп Mutex, Записей, %: 60, 310.9 нс/оп Mutex, Записей, %: 80, 326.6 нс/оп Mutex, Записей, %: 90, 311.9 нс/оп Mutex, Записей, %: 99, 296.9 нс/оп Mutex, Записей, %: 100, 318.6 нс/оп SyncMap, Записей, %: 1, 6.58 нс/оп SyncMap, Записей, %: 2, 7.14 нс/оп SyncMap, Записей, %: 5, 9.26 нс/оп SyncMap, Записей, %: 10, 12.08 нс/оп SyncMap, Записей, %: 20, 16.54 нс/оп SyncMap, Записей, %: 40, 25.7 нс/оп SyncMap, Записей, %: 60, 34.77 нс/оп SyncMap, Записей, %: 80, 41.74 нс/оп SyncMap, Записей, %: 90, 45.47 нс/оп SyncMap, Записей, %: 99, 48.88 нс/оп SyncMap, Записей, %: 100, 48.82 нс/оп Доля Store при P=12 и 4096 ключах; медиана пяти повторов, меньше лучше Размер map: только чтение Теперь меняем число ключей: от одного до 10 млн. На каждой линии 22 точки, P=12. Горутины читают заранее заполненную map.
Ось X логарифмическая. Это помогает уместить на одном графике и единицы, и миллионы ключей. Время заполнения таблицы в замер не входит.
0 200 400 600 нс/оп 1 4 16 64 256 1 024 4 096 65 536 500 000 10 000 000 Ключей в map RWMutex Mutex SyncMap RWMutex, Ключей в map: 1, 27.36 нс/оп RWMutex, Ключей в map: 2, 29.48 нс/оп RWMutex, Ключей в map: 4, 30.99 нс/оп RWMutex, Ключей в map: 8, 30.53 нс/оп RWMutex, Ключей в map: 16, 35.83 нс/оп RWMutex, Ключей в map: 32, 36.38 нс/оп RWMutex, Ключей в map: 64, 36.21 нс/оп RWMutex, Ключей в map: 128, 37.02 нс/оп RWMutex, Ключей в map: 256, 36.25 нс/оп RWMutex, Ключей в map: 512, 36.95 нс/оп RWMutex, Ключей в map: 1024, 38.17 нс/оп RWMutex, Ключей в map: 4096, 37.83 нс/оп RWMutex, Ключей в map: 16384, 38.17 нс/оп RWMutex, Ключей в map: 65536, 38.3 нс/оп RWMutex, Ключей в map: 100000, 38.22 нс/оп RWMutex, Ключей в map: 250000, 38.68 нс/оп RWMutex, Ключей в map: 500000, 40.29 нс/оп RWMutex, Ключей в map: 750000, 41.27 нс/оп RWMutex, Ключей в map: 1000000, 44.87 нс/оп RWMutex, Ключей в map: 3000000, 43.68 нс/оп RWMutex, Ключей в map: 5000000, 43.8 нс/оп RWMutex, Ключей в map: 10000000, 46.04 нс/оп Mutex, Ключей в map: 1, 126.0 нс/оп Mutex, Ключей в map: 2, 116.1 нс/оп Mutex, Ключей в map: 4, 153.0 нс/оп Mutex, Ключей в map: 8, 147.8 нс/оп Mutex, Ключей в map: 16, 156.7 нс/оп Mutex, Ключей в map: 32, 151.8 нс/оп Mutex, Ключей в map: 64, 146.5 нс/оп Mutex, Ключей в map: 128, 122.9 нс/оп Mutex, Ключей в map: 256, 152.3 нс/оп Mutex, Ключей в map: 512, 149.5 нс/оп Mutex, Ключей в map: 1024, 168.2 нс/оп Mutex, Ключей в map: 4096, 179.3 нс/оп Mutex, Ключей в map: 16384, 188.8 нс/оп Mutex, Ключей в map: 65536, 226.1 нс/оп Mutex, Ключей в map: 100000, 257.9 нс/оп Mutex, Ключей в map: 250000, 360.6 нс/оп Mutex, Ключей в map: 500000, 376.9 нс/оп Mutex, Ключей в map: 750000, 394.3 нс/оп Mutex, Ключей в map: 1000000, 386.5 нс/оп Mutex, Ключей в map: 3000000, 450.1 нс/оп Mutex, Ключей в map: 5000000, 468.8 нс/оп Mutex, Ключей в map: 10000000, 506.4 нс/оп SyncMap, Ключей в map: 1, 3.42 нс/оп SyncMap, Ключей в map: 2, 3.48 нс/оп SyncMap, Ключей в map: 4, 3.75 нс/оп SyncMap, Ключей в map: 8, 3.71 нс/оп SyncMap, Ключей в map: 16, 3.97 нс/оп SyncMap, Ключей в map: 32, 3.81 нс/оп SyncMap, Ключей в map: 64, 3.76 нс/оп SyncMap, Ключей в map: 128, 4.25 нс/оп SyncMap, Ключей в map: 256, 4.4 нс/оп SyncMap, Ключей в map: 512, 4.33 нс/оп SyncMap, Ключей в map: 1024, 4.72 нс/оп SyncMap, Ключей в map: 4096, 5.53 нс/оп SyncMap, Ключей в map: 16384, 7.01 нс/оп SyncMap, Ключей в map: 65536, 17.63 нс/оп SyncMap, Ключей в map: 100000, 24.25 нс/оп SyncMap, Ключей в map: 250000, 34.87 нс/оп SyncMap, Ключей в map: 500000, 41.83 нс/оп SyncMap, Ключей в map: 750000, 45.94 нс/оп SyncMap, Ключей в map: 1000000, 53.68 нс/оп SyncMap, Ключей в map: 3000000, 55.6 нс/оп SyncMap, Ключей в map: 5000000, 61.33 нс/оп SyncMap, Ключей в map: 10000000, 71.67 нс/оп 0 200 400 600 нс/оп 1 16 256 4 096 10 000 000 Ключей в map RWMutex Mutex SyncMap RWMutex, Ключей в map: 1, 27.36 нс/оп RWMutex, Ключей в map: 2, 29.48 нс/оп RWMutex, Ключей в map: 4, 30.99 нс/оп RWMutex, Ключей в map: 8, 30.53 нс/оп RWMutex, Ключей в map: 16, 35.83 нс/оп RWMutex, Ключей в map: 32, 36.38 нс/оп RWMutex, Ключей в map: 64, 36.21 нс/оп RWMutex, Ключей в map: 128, 37.02 нс/оп RWMutex, Ключей в map: 256, 36.25 нс/оп RWMutex, Ключей в map: 512, 36.95 нс/оп RWMutex, Ключей в map: 1024, 38.17 нс/оп RWMutex, Ключей в map: 4096, 37.83 нс/оп RWMutex, Ключей в map: 16384, 38.17 нс/оп RWMutex, Ключей в map: 65536, 38.3 нс/оп RWMutex, Ключей в map: 100000, 38.22 нс/оп RWMutex, Ключей в map: 250000, 38.68 нс/оп RWMutex, Ключей в map: 500000, 40.29 нс/оп RWMutex, Ключей в map: 750000, 41.27 нс/оп RWMutex, Ключей в map: 1000000, 44.87 нс/оп RWMutex, Ключей в map: 3000000, 43.68 нс/оп RWMutex, Ключей в map: 5000000, 43.8 нс/оп RWMutex, Ключей в map: 10000000, 46.04 нс/оп Mutex, Ключей в map: 1, 126.0 нс/оп Mutex, Ключей в map: 2, 116.1 нс/оп Mutex, Ключей в map: 4, 153.0 нс/оп Mutex, Ключей в map: 8, 147.8 нс/оп Mutex, Ключей в map: 16, 156.7 нс/оп Mutex, Ключей в map: 32, 151.8 нс/оп Mutex, Ключей в map: 64, 146.5 нс/оп Mutex, Ключей в map: 128, 122.9 нс/оп Mutex, Ключей в map: 256, 152.3 нс/оп Mutex, Ключей в map: 512, 149.5 нс/оп Mutex, Ключей в map: 1024, 168.2 нс/оп Mutex, Ключей в map: 4096, 179.3 нс/оп Mutex, Ключей в map: 16384, 188.8 нс/оп Mutex, Ключей в map: 65536, 226.1 нс/оп Mutex, Ключей в map: 100000, 257.9 нс/оп Mutex, Ключей в map: 250000, 360.6 нс/оп Mutex, Ключей в map: 500000, 376.9 нс/оп Mutex, Ключей в map: 750000, 394.3 нс/оп Mutex, Ключей в map: 1000000, 386.5 нс/оп Mutex, Ключей в map: 3000000, 450.1 нс/оп Mutex, Ключей в map: 5000000, 468.8 нс/оп Mutex, Ключей в map: 10000000, 506.4 нс/оп SyncMap, Ключей в map: 1, 3.42 нс/оп SyncMap, Ключей в map: 2, 3.48 нс/оп SyncMap, Ключей в map: 4, 3.75 нс/оп SyncMap, Ключей в map: 8, 3.71 нс/оп SyncMap, Ключей в map: 16, 3.97 нс/оп SyncMap, Ключей в map: 32, 3.81 нс/оп SyncMap, Ключей в map: 64, 3.76 нс/оп SyncMap, Ключей в map: 128, 4.25 нс/оп SyncMap, Ключей в map: 256, 4.4 нс/оп SyncMap, Ключей в map: 512, 4.33 нс/оп SyncMap, Ключей в map: 1024, 4.72 нс/оп SyncMap, Ключей в map: 4096, 5.53 нс/оп SyncMap, Ключей в map: 16384, 7.01 нс/оп SyncMap, Ключей в map: 65536, 17.63 нс/оп SyncMap, Ключей в map: 100000, 24.25 нс/оп SyncMap, Ключей в map: 250000, 34.87 нс/оп SyncMap, Ключей в map: 500000, 41.83 нс/оп SyncMap, Ключей в map: 750000, 45.94 нс/оп SyncMap, Ключей в map: 1000000, 53.68 нс/оп SyncMap, Ключей в map: 3000000, 55.6 нс/оп SyncMap, Ключей в map: 5000000, 61.33 нс/оп SyncMap, Ключей в map: 10000000, 71.67 нс/оп Размер map, 100% Load, P=12; медиана пяти повторов, меньше лучше На миллионе ключей RWMutex показал 44,87 нс/оп, SyncMap 53,68, Mutex 386,5. На 10 млн: RWMutex 46,04, SyncMap 71,67, Mutex 506,4 нс/оп. В этом тесте большой размер изменил выбор по сравнению с чтением 4096 ключей.
Размер map: десять процентов записей Здесь тоже P=12 и до 10 млн ключей. Шанс записи равен 10%. Ключи числовые, значения в map хранятся как указатели. Стоимость копирования больших объектов нужно проверять отдельно.
0 200 400 600 нс/оп 1 4 16 64 256 1 024 4 096 65 536 500 000 10 000 000 Ключей в map RWMutex Mutex SyncMap RWMutex, Ключей в map: 1, 62.1 нс/оп RWMutex, Ключей в map: 2, 76.69 нс/оп RWMutex, Ключей в map: 4, 82.86 нс/оп RWMutex, Ключей в map: 8, 95.28 нс/оп RWMutex, Ключей в map: 16, 88.86 нс/оп RWMutex, Ключей в map: 32, 85.76 нс/оп RWMutex, Ключей в map: 64, 80.85 нс/оп RWMutex, Ключей в map: 128, 85.03 нс/оп RWMutex, Ключей в map: 256, 94.18 нс/оп RWMutex, Ключей в map: 512, 96.98 нс/оп RWMutex, Ключей в map: 1024, 110.4 нс/оп RWMutex, Ключей в map: 4096, 123.1 нс/оп RWMutex, Ключей в map: 16384, 150.6 нс/оп RWMutex, Ключей в map: 65536, 175.7 нс/оп RWMutex, Ключей в map: 100000, 173.1 нс/оп RWMutex, Ключей в map: 250000, 232.0 нс/оп RWMutex, Ключей в map: 500000, 296.6 нс/оп RWMutex, Ключей в map: 750000, 310.4 нс/оп RWMutex, Ключей в map: 1000000, 320.9 нс/оп RWMutex, Ключей в map: 3000000, 340.9 нс/оп RWMutex, Ключей в map: 5000000, 371.9 нс/оп RWMutex, Ключей в map: 10000000, 417.3 нс/оп Mutex, Ключей в map: 1, 127.3 нс/оп Mutex, Ключей в map: 2, 152.9 нс/оп Mutex, Ключей в map: 4, 171.1 нс/оп Mutex, Ключей в map: 8, 163.7 нс/оп Mutex, Ключей в map: 16, 182.5 нс/оп Mutex, Ключей в map: 32, 178.3 нс/оп Mutex, Ключей в map: 64, 193.5 нс/оп Mutex, Ключей в map: 128, 195.7 нс/оп Mutex, Ключей в map: 256, 191.9 нс/оп Mutex, Ключей в map: 512, 205.4 нс/оп Mutex, Ключей в map: 1024, 216.3 нс/оп Mutex, Ключей в map: 4096, 203.5 нс/оп Mutex, Ключей в map: 16384, 230.4 нс/оп Mutex, Ключей в map: 65536, 279.2 нс/оп Mutex, Ключей в map: 100000, 290.5 нс/оп Mutex, Ключей в map: 250000, 372.1 нс/оп Mutex, Ключей в map: 500000, 407.4 нс/оп Mutex, Ключей в map: 750000, 422.6 нс/оп Mutex, Ключей в map: 1000000, 402.2 нс/оп Mutex, Ключей в map: 3000000, 464.0 нс/оп Mutex, Ключей в map: 5000000, 482.8 нс/оп Mutex, Ключей в map: 10000000, 515.0 нс/оп SyncMap, Ключей в map: 1, 86.57 нс/оп SyncMap, Ключей в map: 2, 74.79 нс/оп SyncMap, Ключей в map: 4, 83.85 нс/оп SyncMap, Ключей в map: 8, 76.19 нс/оп SyncMap, Ключей в map: 16, 36.05 нс/оп SyncMap, Ключей в map: 32, 15.58 нс/оп SyncMap, Ключей в map: 64, 13.09 нс/оп SyncMap, Ключей в map: 128, 11.9 нс/оп SyncMap, Ключей в map: 256, 11.06 нс/оп SyncMap, Ключей в map: 512, 10.65 нс/оп SyncMap, Ключей в map: 1024, 11.16 нс/оп SyncMap, Ключей в map: 4096, 11.42 нс/оп SyncMap, Ключей в map: 16384, 13.71 нс/оп SyncMap, Ключей в map: 65536, 26.71 нс/оп SyncMap, Ключей в map: 100000, 31.7 нс/оп SyncMap, Ключей в map: 250000, 40.87 нс/оп SyncMap, Ключей в map: 500000, 50.21 нс/оп SyncMap, Ключей в map: 750000, 56.56 нс/оп SyncMap, Ключей в map: 1000000, 53.76 нс/оп SyncMap, Ключей в map: 3000000, 58.88 нс/оп SyncMap, Ключей в map: 5000000, 64.73 нс/оп SyncMap, Ключей в map: 10000000, 74.7 нс/оп 0 200 400 600 нс/оп 1 16 256 4 096 10 000 000 Ключей в map RWMutex Mutex SyncMap RWMutex, Ключей в map: 1, 62.1 нс/оп RWMutex, Ключей в map: 2, 76.69 нс/оп RWMutex, Ключей в map: 4, 82.86 нс/оп RWMutex, Ключей в map: 8, 95.28 нс/оп RWMutex, Ключей в map: 16, 88.86 нс/оп RWMutex, Ключей в map: 32, 85.76 нс/оп RWMutex, Ключей в map: 64, 80.85 нс/оп RWMutex, Ключей в map: 128, 85.03 нс/оп RWMutex, Ключей в map: 256, 94.18 нс/оп RWMutex, Ключей в map: 512, 96.98 нс/оп RWMutex, Ключей в map: 1024, 110.4 нс/оп RWMutex, Ключей в map: 4096, 123.1 нс/оп RWMutex, Ключей в map: 16384, 150.6 нс/оп RWMutex, Ключей в map: 65536, 175.7 нс/оп RWMutex, Ключей в map: 100000, 173.1 нс/оп RWMutex, Ключей в map: 250000, 232.0 нс/оп RWMutex, Ключей в map: 500000, 296.6 нс/оп RWMutex, Ключей в map: 750000, 310.4 нс/оп RWMutex, Ключей в map: 1000000, 320.9 нс/оп RWMutex, Ключей в map: 3000000, 340.9 нс/оп RWMutex, Ключей в map: 5000000, 371.9 нс/оп RWMutex, Ключей в map: 10000000, 417.3 нс/оп Mutex, Ключей в map: 1, 127.3 нс/оп Mutex, Ключей в map: 2, 152.9 нс/оп Mutex, Ключей в map: 4, 171.1 нс/оп Mutex, Ключей в map: 8, 163.7 нс/оп Mutex, Ключей в map: 16, 182.5 нс/оп Mutex, Ключей в map: 32, 178.3 нс/оп Mutex, Ключей в map: 64, 193.5 нс/оп Mutex, Ключей в map: 128, 195.7 нс/оп Mutex, Ключей в map: 256, 191.9 нс/оп Mutex, Ключей в map: 512, 205.4 нс/оп Mutex, Ключей в map: 1024, 216.3 нс/оп Mutex, Ключей в map: 4096, 203.5 нс/оп Mutex, Ключей в map: 16384, 230.4 нс/оп Mutex, Ключей в map: 65536, 279.2 нс/оп Mutex, Ключей в map: 100000, 290.5 нс/оп Mutex, Ключей в map: 250000, 372.1 нс/оп Mutex, Ключей в map: 500000, 407.4 нс/оп Mutex, Ключей в map: 750000, 422.6 нс/оп Mutex, Ключей в map: 1000000, 402.2 нс/оп Mutex, Ключей в map: 3000000, 464.0 нс/оп Mutex, Ключей в map: 5000000, 482.8 нс/оп Mutex, Ключей в map: 10000000, 515.0 нс/оп SyncMap, Ключей в map: 1, 86.57 нс/оп SyncMap, Ключей в map: 2, 74.79 нс/оп SyncMap, Ключей в map: 4, 83.85 нс/оп SyncMap, Ключей в map: 8, 76.19 нс/оп SyncMap, Ключей в map: 16, 36.05 нс/оп SyncMap, Ключей в map: 32, 15.58 нс/оп SyncMap, Ключей в map: 64, 13.09 нс/оп SyncMap, Ключей в map: 128, 11.9 нс/оп SyncMap, Ключей в map: 256, 11.06 нс/оп SyncMap, Ключей в map: 512, 10.65 нс/оп SyncMap, Ключей в map: 1024, 11.16 нс/оп SyncMap, Ключей в map: 4096, 11.42 нс/оп SyncMap, Ключей в map: 16384, 13.71 нс/оп SyncMap, Ключей в map: 65536, 26.71 нс/оп SyncMap, Ключей в map: 100000, 31.7 нс/оп SyncMap, Ключей в map: 250000, 40.87 нс/оп SyncMap, Ключей в map: 500000, 50.21 нс/оп SyncMap, Ключей в map: 750000, 56.56 нс/оп SyncMap, Ключей в map: 1000000, 53.76 нс/оп SyncMap, Ключей в map: 3000000, 58.88 нс/оп SyncMap, Ключей в map: 5000000, 64.73 нс/оп SyncMap, Ключей в map: 10000000, 74.7 нс/оп Размер map, 10% Store, P=12; медиана пяти повторов, меньше лучше Размер map: половина записей При P=12 чтение и запись имеют равный шанс. Вместе со скоростью стоит смотреть на аллокации: они добавляют работу сборщику мусора.
0 200 400 600 нс/оп 1 4 16 64 256 1 024 4 096 65 536 500 000 10 000 000 Ключей в map RWMutex Mutex SyncMap RWMutex, Ключей в map: 1, 84.36 нс/оп RWMutex, Ключей в map: 2, 92.59 нс/оп RWMutex, Ключей в map: 4, 90.68 нс/оп RWMutex, Ключей в map: 8, 99.45 нс/оп RWMutex, Ключей в map: 16, 99.62 нс/оп RWMutex, Ключей в map: 32, 100.7 нс/оп RWMutex, Ключей в map: 64, 103.6 нс/оп RWMutex, Ключей в map: 128, 105.9 нс/оп RWMutex, Ключей в map: 256, 108.5 нс/оп RWMutex, Ключей в map: 512, 111.3 нс/оп RWMutex, Ключей в map: 1024, 115.9 нс/оп RWMutex, Ключей в map: 4096, 135.8 нс/оп RWMutex, Ключей в map: 16384, 160.2 нс/оп RWMutex, Ключей в map: 65536, 202.8 нс/оп RWMutex, Ключей в map: 100000, 216.0 нс/оп RWMutex, Ключей в map: 250000, 224.6 нс/оп RWMutex, Ключей в map: 500000, 273.5 нс/оп RWMutex, Ключей в map: 750000, 264.0 нс/оп RWMutex, Ключей в map: 1000000, 294.4 нс/оп RWMutex, Ключей в map: 3000000, 298.7 нс/оп RWMutex, Ключей в map: 5000000, 322.3 нс/оп RWMutex, Ключей в map: 10000000, 369.0 нс/оп Mutex, Ключей в map: 1, 171.2 нс/оп Mutex, Ключей в map: 2, 173.5 нс/оп Mutex, Ключей в map: 4, 191.8 нс/оп Mutex, Ключей в map: 8, 195.1 нс/оп Mutex, Ключей в map: 16, 202.0 нс/оп Mutex, Ключей в map: 32, 214.2 нс/оп Mutex, Ключей в map: 64, 240.6 нс/оп Mutex, Ключей в map: 128, 227.4 нс/оп Mutex, Ключей в map: 256, 268.7 нс/оп Mutex, Ключей в map: 512, 274.0 нс/оп Mutex, Ключей в map: 1024, 284.0 нс/оп Mutex, Ключей в map: 4096, 312.4 нс/оп Mutex, Ключей в map: 16384, 285.0 нс/оп Mutex, Ключей в map: 65536, 343.9 нс/оп Mutex, Ключей в map: 100000, 349.0 нс/оп Mutex, Ключей в map: 250000, 395.1 нс/оп Mutex, Ключей в map: 500000, 406.9 нс/оп Mutex, Ключей в map: 750000, 429.5 нс/оп Mutex, Ключей в map: 1000000, 457.4 нс/оп Mutex, Ключей в map: 3000000, 481.8 нс/оп Mutex, Ключей в map: 5000000, 494.2 нс/оп Mutex, Ключей в map: 10000000, 544.3 нс/оп SyncMap, Ключей в map: 1, 265.9 нс/оп SyncMap, Ключей в map: 2, 258.2 нс/оп SyncMap, Ключей в map: 4, 243.1 нс/оп SyncMap, Ключей в map: 8, 232.4 нс/оп SyncMap, Ключей в map: 16, 181.8 нс/оп SyncMap, Ключей в map: 32, 63.39 нс/оп SyncMap, Ключей в map: 64, 38.01 нс/оп SyncMap, Ключей в map: 128, 33.73 нс/оп SyncMap, Ключей в map: 256, 29.01 нс/оп SyncMap, Ключей в map: 512, 27.67 нс/оп SyncMap, Ключей в map: 1024, 27.71 нс/оп SyncMap, Ключей в map: 4096, 29.91 нс/оп SyncMap, Ключей в map: 16384, 29.44 нс/оп SyncMap, Ключей в map: 65536, 39.9 нс/оп SyncMap, Ключей в map: 100000, 45.83 нс/оп SyncMap, Ключей в map: 250000, 57.49 нс/оп SyncMap, Ключей в map: 500000, 64.91 нс/оп SyncMap, Ключей в map: 750000, 67.66 нс/оп SyncMap, Ключей в map: 1000000, 65.68 нс/оп SyncMap, Ключей в map: 3000000, 69.25 нс/оп SyncMap, Ключей в map: 5000000, 75.07 нс/оп SyncMap, Ключей в map: 10000000, 84.89 нс/оп 0 200 400 600 нс/оп 1 16 256 4 096 10 000 000 Ключей в map RWMutex Mutex SyncMap RWMutex, Ключей в map: 1, 84.36 нс/оп RWMutex, Ключей в map: 2, 92.59 нс/оп RWMutex, Ключей в map: 4, 90.68 нс/оп RWMutex, Ключей в map: 8, 99.45 нс/оп RWMutex, Ключей в map: 16, 99.62 нс/оп RWMutex, Ключей в map: 32, 100.7 нс/оп RWMutex, Ключей в map: 64, 103.6 нс/оп RWMutex, Ключей в map: 128, 105.9 нс/оп RWMutex, Ключей в map: 256, 108.5 нс/оп RWMutex, Ключей в map: 512, 111.3 нс/оп RWMutex, Ключей в map: 1024, 115.9 нс/оп RWMutex, Ключей в map: 4096, 135.8 нс/оп RWMutex, Ключей в map: 16384, 160.2 нс/оп RWMutex, Ключей в map: 65536, 202.8 нс/оп RWMutex, Ключей в map: 100000, 216.0 нс/оп RWMutex, Ключей в map: 250000, 224.6 нс/оп RWMutex, Ключей в map: 500000, 273.5 нс/оп RWMutex, Ключей в map: 750000, 264.0 нс/оп RWMutex, Ключей в map: 1000000, 294.4 нс/оп RWMutex, Ключей в map: 3000000, 298.7 нс/оп RWMutex, Ключей в map: 5000000, 322.3 нс/оп RWMutex, Ключей в map: 10000000, 369.0 нс/оп Mutex, Ключей в map: 1, 171.2 нс/оп Mutex, Ключей в map: 2, 173.5 нс/оп Mutex, Ключей в map: 4, 191.8 нс/оп Mutex, Ключей в map: 8, 195.1 нс/оп Mutex, Ключей в map: 16, 202.0 нс/оп Mutex, Ключей в map: 32, 214.2 нс/оп Mutex, Ключей в map: 64, 240.6 нс/оп Mutex, Ключей в map: 128, 227.4 нс/оп Mutex, Ключей в map: 256, 268.7 нс/оп Mutex, Ключей в map: 512, 274.0 нс/оп Mutex, Ключей в map: 1024, 284.0 нс/оп Mutex, Ключей в map: 4096, 312.4 нс/оп Mutex, Ключей в map: 16384, 285.0 нс/оп Mutex, Ключей в map: 65536, 343.9 нс/оп Mutex, Ключей в map: 100000, 349.0 нс/оп Mutex, Ключей в map: 250000, 395.1 нс/оп Mutex, Ключей в map: 500000, 406.9 нс/оп Mutex, Ключей в map: 750000, 429.5 нс/оп Mutex, Ключей в map: 1000000, 457.4 нс/оп Mutex, Ключей в map: 3000000, 481.8 нс/оп Mutex, Ключей в map: 5000000, 494.2 нс/оп Mutex, Ключей в map: 10000000, 544.3 нс/оп SyncMap, Ключей в map: 1, 265.9 нс/оп SyncMap, Ключей в map: 2, 258.2 нс/оп SyncMap, Ключей в map: 4, 243.1 нс/оп SyncMap, Ключей в map: 8, 232.4 нс/оп SyncMap, Ключей в map: 16, 181.8 нс/оп SyncMap, Ключей в map: 32, 63.39 нс/оп SyncMap, Ключей в map: 64, 38.01 нс/оп SyncMap, Ключей в map: 128, 33.73 нс/оп SyncMap, Ключей в map: 256, 29.01 нс/оп SyncMap, Ключей в map: 512, 27.67 нс/оп SyncMap, Ключей в map: 1024, 27.71 нс/оп SyncMap, Ключей в map: 4096, 29.91 нс/оп SyncMap, Ключей в map: 16384, 29.44 нс/оп SyncMap, Ключей в map: 65536, 39.9 нс/оп SyncMap, Ключей в map: 100000, 45.83 нс/оп SyncMap, Ключей в map: 250000, 57.49 нс/оп SyncMap, Ключей в map: 500000, 64.91 нс/оп SyncMap, Ключей в map: 750000, 67.66 нс/оп SyncMap, Ключей в map: 1000000, 65.68 нс/оп SyncMap, Ключей в map: 3000000, 69.25 нс/оп SyncMap, Ключей в map: 5000000, 75.07 нс/оп SyncMap, Ключей в map: 10000000, 84.89 нс/оп Размер map, 50% Store, P=12; медиана пяти повторов, меньше лучше При 16 ключах RWMutex показал 99,62 нс/оп, SyncMap 181,8, Mutex 202. При миллионе быстрее стал SyncMap: 65,68 нс/оп. У RWMutex получилось 294,4, у Mutex 457,4. Число горутин и доля записей не менялись.
От миллиона до десяти миллионов ключей Ниже те же большие точки крупнее. Ось X теперь линейная. На всех трёх графиках числовые ключи и P=12.
0 200 400 600 нс/оп 1 000 000 3 000 000 5 000 000 10 000 000 Ключей в map RWMutex Mutex SyncMap RWMutex, Ключей в map: 1000000, 44.87 нс/оп 44.87 RWMutex, Ключей в map: 3000000, 43.68 нс/оп 43.68 RWMutex, Ключей в map: 5000000, 43.8 нс/оп 43.8 RWMutex, Ключей в map: 10000000, 46.04 нс/оп 46.04 Mutex, Ключей в map: 1000000, 386.5 нс/оп 386.5 Mutex, Ключей в map: 3000000, 450.1 нс/оп 450.1 Mutex, Ключей в map: 5000000, 468.8 нс/оп 468.8 Mutex, Ключей в map: 10000000, 506.4 нс/оп 506.4 SyncMap, Ключей в map: 1000000, 53.68 нс/оп SyncMap, Ключей в map: 3000000, 55.6 нс/оп SyncMap, Ключей в map: 5000000, 61.33 нс/оп SyncMap, Ключей в map: 10000000, 71.67 нс/оп 0 200 400 600 нс/оп 1 000 000 5 000 000 10 000 000 Ключей в map RWMutex Mutex SyncMap RWMutex, Ключей в map: 1000000, 44.87 нс/оп 44.87 RWMutex, Ключей в map: 3000000, 43.68 нс/оп RWMutex, Ключей в map: 5000000, 43.8 нс/оп 43.8 RWMutex, Ключей в map: 10000000, 46.04 нс/оп 46.04 Mutex, Ключей в map: 1000000, 386.5 нс/оп 386.5 Mutex, Ключей в map: 3000000, 450.1 нс/оп 450.1 Mutex, Ключей в map: 5000000, 468.8 нс/оп 468.8 Mutex, Ключей в map: 10000000, 506.4 нс/оп 506.4 SyncMap, Ключей в map: 1000000, 53.68 нс/оп SyncMap, Ключей в map: 3000000, 55.6 нс/оп SyncMap, Ключей в map: 5000000, 61.33 нс/оп SyncMap, Ключей в map: 10000000, 71.67 нс/оп 1–10 млн ключей, 0% записей, P=12; нс/оп, меньше лучше 0 200 400 600 нс/оп 1 000 000 3 000 000 5 000 000 10 000 000 Ключей в map RWMutex Mutex SyncMap RWMutex, Ключей в map: 1000000, 320.9 нс/оп 320.9 RWMutex, Ключей в map: 3000000, 340.9 нс/оп 340.9 RWMutex, Ключей в map: 5000000, 371.9 нс/оп 371.9 RWMutex, Ключей в map: 10000000, 417.3 нс/оп 417.3 Mutex, Ключей в map: 1000000, 402.2 нс/оп 402.2 Mutex, Ключей в map: 3000000, 464.0 нс/оп 464.0 Mutex, Ключей в map: 5000000, 482.8 нс/оп 482.8 Mutex, Ключей в map: 10000000, 515.0 нс/оп 515.0 SyncMap, Ключей в map: 1000000, 53.76 нс/оп 53.76 SyncMap, Ключей в map: 3000000, 58.88 нс/оп 58.88 SyncMap, Ключей в map: 5000000, 64.73 нс/оп 64.73 SyncMap, Ключей в map: 10000000, 74.7 нс/оп 74.7 0 200 400 600 нс/оп 1 000 000 5 000 000 10 000 000 Ключей в map RWMutex Mutex SyncMap RWMutex, Ключей в map: 1000000, 320.9 нс/оп 320.9 RWMutex, Ключей в map: 3000000, 340.9 нс/оп 340.9 RWMutex, Ключей в map: 5000000, 371.9 нс/оп 371.9 RWMutex, Ключей в map: 10000000, 417.3 нс/оп 417.3 Mutex, Ключей в map: 1000000, 402.2 нс/оп 402.2 Mutex, Ключей в map: 3000000, 464.0 нс/оп 464.0 Mutex, Ключей в map: 5000000, 482.8 нс/оп 482.8 Mutex, Ключей в map: 10000000, 515.0 нс/оп 515.0 SyncMap, Ключей в map: 1000000, 53.76 нс/оп 53.76 SyncMap, Ключей в map: 3000000, 58.88 нс/оп 58.88 SyncMap, Ключей в map: 5000000, 64.73 нс/оп 64.73 SyncMap, Ключей в map: 10000000, 74.7 нс/оп 74.7 1–10 млн ключей, 10% записей, P=12; нс/оп, меньше лучше 0 200 400 600 нс/оп 1 000 000 3 000 000 5 000 000 10 000 000 Ключей в map RWMutex Mutex SyncMap RWMutex, Ключей в map: 1000000, 294.4 нс/оп 294.4 RWMutex, Ключей в map: 3000000, 298.7 нс/оп 298.7 RWMutex, Ключей в map: 5000000, 322.3 нс/оп 322.3 RWMutex, Ключей в map: 10000000, 369.0 нс/оп 369.0 Mutex, Ключей в map: 1000000, 457.4 нс/оп 457.4 Mutex, Ключей в map: 3000000, 481.8 нс/оп 481.8 Mutex, Ключей в map: 5000000, 494.2 нс/оп 494.2 Mutex, Ключей в map: 10000000, 544.3 нс/оп 544.3 SyncMap, Ключей в map: 1000000, 65.68 нс/оп 65.68 SyncMap, Ключей в map: 3000000, 69.25 нс/оп 69.25 SyncMap, Ключей в map: 5000000, 75.07 нс/оп 75.07 SyncMap, Ключей в map: 10000000, 84.89 нс/оп 84.89 0 200 400 600 нс/оп 1 000 000 5 000 000 10 000 000 Ключей в map RWMutex Mutex SyncMap RWMutex, Ключей в map: 1000000, 294.4 нс/оп 294.4 RWMutex, Ключей в map: 3000000, 298.7 нс/оп 298.7 RWMutex, Ключей в map: 5000000, 322.3 нс/оп 322.3 RWMutex, Ключей в map: 10000000, 369.0 нс/оп 369.0 Mutex, Ключей в map: 1000000, 457.4 нс/оп 457.4 Mutex, Ключей в map: 3000000, 481.8 нс/оп 481.8 Mutex, Ключей в map: 5000000, 494.2 нс/оп 494.2 Mutex, Ключей в map: 10000000, 544.3 нс/оп 544.3 SyncMap, Ключей в map: 1000000, 65.68 нс/оп 65.68 SyncMap, Ключей в map: 3000000, 69.25 нс/оп 69.25 SyncMap, Ключей в map: 5000000, 75.07 нс/оп 75.07 SyncMap, Ключей в map: 10000000, 84.89 нс/оп 84.89 1–10 млн ключей, 50% записей, P=12; нс/оп, меньше лучше Размер map: только запись Меняем размер от одного ключа до миллиона. Каждый вызов перезаписывает готовый ключ. В начале графика горутины делят один или несколько ключей. В конце их обращения распределены по большой таблице.
0 200 400 600 нс/оп 1 4 16 64 256 1 024 4 096 16 384 65 536 1 000 000 Ключей в map RWMutex Mutex SyncMap RWMutex, Ключей в map: 1, 201.5 нс/оп RWMutex, Ключей в map: 2, 209.9 нс/оп RWMutex, Ключей в map: 4, 245.6 нс/оп RWMutex, Ключей в map: 8, 225.0 нс/оп RWMutex, Ключей в map: 16, 259.6 нс/оп RWMutex, Ключей в map: 32, 247.5 нс/оп RWMutex, Ключей в map: 64, 261.8 нс/оп RWMutex, Ключей в map: 128, 291.3 нс/оп RWMutex, Ключей в map: 256, 320.3 нс/оп RWMutex, Ключей в map: 512, 324.0 нс/оп RWMutex, Ключей в map: 1024, 327.0 нс/оп RWMutex, Ключей в map: 4096, 361.0 нс/оп RWMutex, Ключей в map: 16384, 408.3 нс/оп RWMutex, Ключей в map: 65536, 423.0 нс/оп RWMutex, Ключей в map: 100000, 452.7 нс/оп RWMutex, Ключей в map: 250000, 487.6 нс/оп RWMutex, Ключей в map: 500000, 484.4 нс/оп RWMutex, Ключей в map: 750000, 485.0 нс/оп RWMutex, Ключей в map: 1000000, 523.3 нс/оп Mutex, Ключей в map: 1, 159.4 нс/оп Mutex, Ключей в map: 2, 157.1 нс/оп Mutex, Ключей в map: 4, 165.2 нс/оп Mutex, Ключей в map: 8, 175.4 нс/оп Mutex, Ключей в map: 16, 182.2 нс/оп Mutex, Ключей в map: 32, 202.9 нс/оп Mutex, Ключей в map: 64, 235.2 нс/оп Mutex, Ключей в map: 128, 244.9 нс/оп Mutex, Ключей в map: 256, 242.7 нс/оп Mutex, Ключей в map: 512, 239.9 нс/оп Mutex, Ключей в map: 1024, 293.5 нс/оп Mutex, Ключей в map: 4096, 275.1 нс/оп Mutex, Ключей в map: 16384, 324.1 нс/оп Mutex, Ключей в map: 65536, 371.7 нс/оп Mutex, Ключей в map: 100000, 394.6 нс/оп Mutex, Ключей в map: 250000, 424.0 нс/оп Mutex, Ключей в map: 500000, 450.6 нс/оп Mutex, Ключей в map: 750000, 431.3 нс/оп Mutex, Ключей в map: 1000000, 452.6 нс/оп SyncMap, Ключей в map: 1, 372.5 нс/оп SyncMap, Ключей в map: 2, 416.1 нс/оп SyncMap, Ключей в map: 4, 375.7 нс/оп SyncMap, Ключей в map: 8, 323.0 нс/оп SyncMap, Ключей в map: 16, 217.9 нс/оп SyncMap, Ключей в map: 32, 184.2 нс/оп SyncMap, Ключей в map: 64, 68.12 нс/оп SyncMap, Ключей в map: 128, 54.36 нс/оп SyncMap, Ключей в map: 256, 45.38 нс/оп SyncMap, Ключей в map: 512, 44.85 нс/оп SyncMap, Ключей в map: 1024, 45.35 нс/оп SyncMap, Ключей в map: 4096, 48.86 нс/оп SyncMap, Ключей в map: 16384, 45.85 нс/оп SyncMap, Ключей в map: 65536, 55.2 нс/оп SyncMap, Ключей в map: 100000, 59.65 нс/оп SyncMap, Ключей в map: 250000, 74.08 нс/оп SyncMap, Ключей в map: 500000, 90.08 нс/оп SyncMap, Ключей в map: 750000, 108.1 нс/оп SyncMap, Ключей в map: 1000000, 109.4 нс/оп 0 200 400 600 нс/оп 1 16 256 4 096 1 000 000 Ключей в map RWMutex Mutex SyncMap RWMutex, Ключей в map: 1, 201.5 нс/оп RWMutex, Ключей в map: 2, 209.9 нс/оп RWMutex, Ключей в map: 4, 245.6 нс/оп RWMutex, Ключей в map: 8, 225.0 нс/оп RWMutex, Ключей в map: 16, 259.6 нс/оп RWMutex, Ключей в map: 32, 247.5 нс/оп RWMutex, Ключей в map: 64, 261.8 нс/оп RWMutex, Ключей в map: 128, 291.3 нс/оп RWMutex, Ключей в map: 256, 320.3 нс/оп RWMutex, Ключей в map: 512, 324.0 нс/оп RWMutex, Ключей в map: 1024, 327.0 нс/оп RWMutex, Ключей в map: 4096, 361.0 нс/оп RWMutex, Ключей в map: 16384, 408.3 нс/оп RWMutex, Ключей в map: 65536, 423.0 нс/оп RWMutex, Ключей в map: 100000, 452.7 нс/оп RWMutex, Ключей в map: 250000, 487.6 нс/оп RWMutex, Ключей в map: 500000, 484.4 нс/оп RWMutex, Ключей в map: 750000, 485.0 нс/оп RWMutex, Ключей в map: 1000000, 523.3 нс/оп Mutex, Ключей в map: 1, 159.4 нс/оп Mutex, Ключей в map: 2, 157.1 нс/оп Mutex, Ключей в map: 4, 165.2 нс/оп Mutex, Ключей в map: 8, 175.4 нс/оп Mutex, Ключей в map: 16, 182.2 нс/оп Mutex, Ключей в map: 32, 202.9 нс/оп Mutex, Ключей в map: 64, 235.2 нс/оп Mutex, Ключей в map: 128, 244.9 нс/оп Mutex, Ключей в map: 256, 242.7 нс/оп Mutex, Ключей в map: 512, 239.9 нс/оп Mutex, Ключей в map: 1024, 293.5 нс/оп Mutex, Ключей в map: 4096, 275.1 нс/оп Mutex, Ключей в map: 16384, 324.1 нс/оп Mutex, Ключей в map: 65536, 371.7 нс/оп Mutex, Ключей в map: 100000, 394.6 нс/оп Mutex, Ключей в map: 250000, 424.0 нс/оп Mutex, Ключей в map: 500000, 450.6 нс/оп Mutex, Ключей в map: 750000, 431.3 нс/оп Mutex, Ключей в map: 1000000, 452.6 нс/оп SyncMap, Ключей в map: 1, 372.5 нс/оп SyncMap, Ключей в map: 2, 416.1 нс/оп SyncMap, Ключей в map: 4, 375.7 нс/оп SyncMap, Ключей в map: 8, 323.0 нс/оп SyncMap, Ключей в map: 16, 217.9 нс/оп SyncMap, Ключей в map: 32, 184.2 нс/оп SyncMap, Ключей в map: 64, 68.12 нс/оп SyncMap, Ключей в map: 128, 54.36 нс/оп SyncMap, Ключей в map: 256, 45.38 нс/оп SyncMap, Ключей в map: 512, 44.85 нс/оп SyncMap, Ключей в map: 1024, 45.35 нс/оп SyncMap, Ключей в map: 4096, 48.86 нс/оп SyncMap, Ключей в map: 16384, 45.85 нс/оп SyncMap, Ключей в map: 65536, 55.2 нс/оп SyncMap, Ключей в map: 100000, 59.65 нс/оп SyncMap, Ключей в map: 250000, 74.08 нс/оп SyncMap, Ключей в map: 500000, 90.08 нс/оп SyncMap, Ключей в map: 750000, 108.1 нс/оп SyncMap, Ключей в map: 1000000, 109.4 нс/оп Размер map, 100% Store, P=12; медиана пяти повторов, меньше лучше Размер map: промахи Размер заполненной map растёт от одного ключа до миллиона. Горутины ищут ключи из другого диапазона. Каждый поиск даёт промах.
0 200 400 600 нс/оп 1 4 16 64 256 1 024 4 096 16 384 65 536 1 000 000 Ключей в map RWMutex Mutex SyncMap RWMutex, Ключей в map: 1, 29.21 нс/оп RWMutex, Ключей в map: 2, 28.41 нс/оп RWMutex, Ключей в map: 4, 28.5 нс/оп RWMutex, Ключей в map: 8, 29.12 нс/оп RWMutex, Ключей в map: 16, 36.1 нс/оп RWMutex, Ключей в map: 32, 36.03 нс/оп RWMutex, Ключей в map: 64, 36.56 нс/оп RWMutex, Ключей в map: 128, 35.51 нс/оп RWMutex, Ключей в map: 256, 37.63 нс/оп RWMutex, Ключей в map: 512, 37.2 нс/оп RWMutex, Ключей в map: 1024, 38.69 нс/оп RWMutex, Ключей в map: 4096, 36.22 нс/оп RWMutex, Ключей в map: 16384, 36.77 нс/оп RWMutex, Ключей в map: 65536, 37.54 нс/оп RWMutex, Ключей в map: 100000, 37.64 нс/оп RWMutex, Ключей в map: 250000, 40.01 нс/оп RWMutex, Ключей в map: 500000, 40.75 нс/оп RWMutex, Ключей в map: 750000, 47.61 нс/оп RWMutex, Ключей в map: 1000000, 45.86 нс/оп Mutex, Ключей в map: 1, 129.7 нс/оп Mutex, Ключей в map: 2, 122.5 нс/оп Mutex, Ключей в map: 4, 141.2 нс/оп Mutex, Ключей в map: 8, 133.7 нс/оп Mutex, Ключей в map: 16, 137.5 нс/оп Mutex, Ключей в map: 32, 150.5 нс/оп Mutex, Ключей в map: 64, 126.5 нс/оп Mutex, Ключей в map: 128, 154.4 нс/оп Mutex, Ключей в map: 256, 130.9 нс/оп Mutex, Ключей в map: 512, 138.9 нс/оп Mutex, Ключей в map: 1024, 160.3 нс/оп Mutex, Ключей в map: 4096, 176.7 нс/оп Mutex, Ключей в map: 16384, 181.5 нс/оп Mutex, Ключей в map: 65536, 242.8 нс/оп Mutex, Ключей в map: 100000, 291.9 нс/оп Mutex, Ключей в map: 250000, 347.6 нс/оп Mutex, Ключей в map: 500000, 396.1 нс/оп Mutex, Ключей в map: 750000, 415.9 нс/оп Mutex, Ключей в map: 1000000, 422.8 нс/оп SyncMap, Ключей в map: 1, 2.35 нс/оп SyncMap, Ключей в map: 2, 2.34 нс/оп SyncMap, Ключей в map: 4, 2.76 нс/оп SyncMap, Ключей в map: 8, 2.98 нс/оп SyncMap, Ключей в map: 16, 3.2 нс/оп SyncMap, Ключей в map: 32, 3.27 нс/оп SyncMap, Ключей в map: 64, 3.0 нс/оп SyncMap, Ключей в map: 128, 3.27 нс/оп SyncMap, Ключей в map: 256, 3.59 нс/оп SyncMap, Ключей в map: 512, 3.58 нс/оп SyncMap, Ключей в map: 1024, 3.46 нс/оп SyncMap, Ключей в map: 4096, 4.5 нс/оп SyncMap, Ключей в map: 16384, 5.03 нс/оп SyncMap, Ключей в map: 65536, 10.39 нс/оп SyncMap, Ключей в map: 100000, 14.89 нс/оп SyncMap, Ключей в map: 250000, 21.66 нс/оп SyncMap, Ключей в map: 500000, 28.14 нс/оп SyncMap, Ключей в map: 750000, 33.06 нс/оп SyncMap, Ключей в map: 1000000, 36.07 нс/оп 0 200 400 600 нс/оп 1 16 256 4 096 1 000 000 Ключей в map RWMutex Mutex SyncMap RWMutex, Ключей в map: 1, 29.21 нс/оп RWMutex, Ключей в map: 2, 28.41 нс/оп RWMutex, Ключей в map: 4, 28.5 нс/оп RWMutex, Ключей в map: 8, 29.12 нс/оп RWMutex, Ключей в map: 16, 36.1 нс/оп RWMutex, Ключей в map: 32, 36.03 нс/оп RWMutex, Ключей в map: 64, 36.56 нс/оп RWMutex, Ключей в map: 128, 35.51 нс/оп RWMutex, Ключей в map: 256, 37.63 нс/оп RWMutex, Ключей в map: 512, 37.2 нс/оп RWMutex, Ключей в map: 1024, 38.69 нс/оп RWMutex, Ключей в map: 4096, 36.22 нс/оп RWMutex, Ключей в map: 16384, 36.77 нс/оп RWMutex, Ключей в map: 65536, 37.54 нс/оп RWMutex, Ключей в map: 100000, 37.64 нс/оп RWMutex, Ключей в map: 250000, 40.01 нс/оп RWMutex, Ключей в map: 500000, 40.75 нс/оп RWMutex, Ключей в map: 750000, 47.61 нс/оп RWMutex, Ключей в map: 1000000, 45.86 нс/оп Mutex, Ключей в map: 1, 129.7 нс/оп Mutex, Ключей в map: 2, 122.5 нс/оп Mutex, Ключей в map: 4, 141.2 нс/оп Mutex, Ключей в map: 8, 133.7 нс/оп Mutex, Ключей в map: 16, 137.5 нс/оп Mutex, Ключей в map: 32, 150.5 нс/оп Mutex, Ключей в map: 64, 126.5 нс/оп Mutex, Ключей в map: 128, 154.4 нс/оп Mutex, Ключей в map: 256, 130.9 нс/оп Mutex, Ключей в map: 512, 138.9 нс/оп Mutex, Ключей в map: 1024, 160.3 нс/оп Mutex, Ключей в map: 4096, 176.7 нс/оп Mutex, Ключей в map: 16384, 181.5 нс/оп Mutex, Ключей в map: 65536, 242.8 нс/оп Mutex, Ключей в map: 100000, 291.9 нс/оп Mutex, Ключей в map: 250000, 347.6 нс/оп Mutex, Ключей в map: 500000, 396.1 нс/оп Mutex, Ключей в map: 750000, 415.9 нс/оп Mutex, Ключей в map: 1000000, 422.8 нс/оп SyncMap, Ключей в map: 1, 2.35 нс/оп SyncMap, Ключей в map: 2, 2.34 нс/оп SyncMap, Ключей в map: 4, 2.76 нс/оп SyncMap, Ключей в map: 8, 2.98 нс/оп SyncMap, Ключей в map: 16, 3.2 нс/оп SyncMap, Ключей в map: 32, 3.27 нс/оп SyncMap, Ключей в map: 64, 3.0 нс/оп SyncMap, Ключей в map: 128, 3.27 нс/оп SyncMap, Ключей в map: 256, 3.59 нс/оп SyncMap, Ключей в map: 512, 3.58 нс/оп SyncMap, Ключей в map: 1024, 3.46 нс/оп SyncMap, Ключей в map: 4096, 4.5 нс/оп SyncMap, Ключей в map: 16384, 5.03 нс/оп SyncMap, Ключей в map: 65536, 10.39 нс/оп SyncMap, Ключей в map: 100000, 14.89 нс/оп SyncMap, Ключей в map: 250000, 21.66 нс/оп SyncMap, Ключей в map: 500000, 28.14 нс/оп SyncMap, Ключей в map: 750000, 33.06 нс/оп SyncMap, Ключей в map: 1000000, 36.07 нс/оп Размер map, Load отсутствующего ключа, P=12; медиана пяти повторов, меньше лучше Размер map: удаление и вставка На каждом размере один шаг вызывает Delete, затем Store. Размеры те же: от одного ключа до миллиона. Пару вызовов нельзя считать одной операцией с map.
0 500 1 000 1 500 нс/оп 1 4 16 64 256 1 024 4 096 16 384 65 536 1 000 000 Ключей в map RWMutex Mutex SyncMap RWMutex, Ключей в map: 1, 471.7 нс/оп RWMutex, Ключей в map: 2, 523.3 нс/оп RWMutex, Ключей в map: 4, 470.8 нс/оп RWMutex, Ключей в map: 8, 520.5 нс/оп RWMutex, Ключей в map: 16, 574.2 нс/оп RWMutex, Ключей в map: 32, 616.5 нс/оп RWMutex, Ключей в map: 64, 634.7 нс/оп RWMutex, Ключей в map: 128, 655.2 нс/оп RWMutex, Ключей в map: 256, 624.8 нс/оп RWMutex, Ключей в map: 512, 606.8 нс/оп RWMutex, Ключей в map: 1024, 721.3 нс/оп RWMutex, Ключей в map: 4096, 739.3 нс/оп RWMutex, Ключей в map: 16384, 774.1 нс/оп RWMutex, Ключей в map: 65536, 865.9 нс/оп RWMutex, Ключей в map: 100000, 946.6 нс/оп RWMutex, Ключей в map: 250000, 926.3 нс/оп RWMutex, Ключей в map: 500000, 1 008.0 нс/оп RWMutex, Ключей в map: 750000, 1 018.0 нс/оп RWMutex, Ключей в map: 1000000, 909.7 нс/оп Mutex, Ключей в map: 1, 411.0 нс/оп Mutex, Ключей в map: 2, 440.2 нс/оп Mutex, Ключей в map: 4, 400.3 нс/оп Mutex, Ключей в map: 8, 416.3 нс/оп Mutex, Ключей в map: 16, 482.7 нс/оп Mutex, Ключей в map: 32, 499.6 нс/оп Mutex, Ключей в map: 64, 497.0 нс/оп Mutex, Ключей в map: 128, 568.6 нс/оп Mutex, Ключей в map: 256, 567.7 нс/оп Mutex, Ключей в map: 512, 563.9 нс/оп Mutex, Ключей в map: 1024, 648.4 нс/оп Mutex, Ключей в map: 4096, 635.5 нс/оп Mutex, Ключей в map: 16384, 716.1 нс/оп Mutex, Ключей в map: 65536, 602.2 нс/оп Mutex, Ключей в map: 100000, 855.5 нс/оп Mutex, Ключей в map: 250000, 876.5 нс/оп Mutex, Ключей в map: 500000, 944.9 нс/оп Mutex, Ключей в map: 750000, 989.2 нс/оп Mutex, Ключей в map: 1000000, 1 012.0 нс/оп SyncMap, Ключей в map: 1, 578.8 нс/оп SyncMap, Ключей в map: 2, 607.0 нс/оп SyncMap, Ключей в map: 4, 596.8 нс/оп SyncMap, Ключей в map: 8, 537.2 нс/оп SyncMap, Ключей в map: 16, 410.8 нс/оп SyncMap, Ключей в map: 32, 252.9 нс/оп SyncMap, Ключей в map: 64, 85.19 нс/оп SyncMap, Ключей в map: 128, 71.26 нс/оп SyncMap, Ключей в map: 256, 55.51 нс/оп SyncMap, Ключей в map: 512, 53.47 нс/оп SyncMap, Ключей в map: 1024, 51.83 нс/оп SyncMap, Ключей в map: 4096, 56.28 нс/оп SyncMap, Ключей в map: 16384, 52.74 нс/оп SyncMap, Ключей в map: 65536, 64.49 нс/оп SyncMap, Ключей в map: 100000, 69.08 нс/оп SyncMap, Ключей в map: 250000, 83.99 нс/оп SyncMap, Ключей в map: 500000, 91.89 нс/оп SyncMap, Ключей в map: 750000, 127.3 нс/оп SyncMap, Ключей в map: 1000000, 112.1 нс/оп 0 500 1 000 1 500 нс/оп 1 16 256 4 096 1 000 000 Ключей в map RWMutex Mutex SyncMap RWMutex, Ключей в map: 1, 471.7 нс/оп RWMutex, Ключей в map: 2, 523.3 нс/оп RWMutex, Ключей в map: 4, 470.8 нс/оп RWMutex, Ключей в map: 8, 520.5 нс/оп RWMutex, Ключей в map: 16, 574.2 нс/оп RWMutex, Ключей в map: 32, 616.5 нс/оп RWMutex, Ключей в map: 64, 634.7 нс/оп RWMutex, Ключей в map: 128, 655.2 нс/оп RWMutex, Ключей в map: 256, 624.8 нс/оп RWMutex, Ключей в map: 512, 606.8 нс/оп RWMutex, Ключей в map: 1024, 721.3 нс/оп RWMutex, Ключей в map: 4096, 739.3 нс/оп RWMutex, Ключей в map: 16384, 774.1 нс/оп RWMutex, Ключей в map: 65536, 865.9 нс/оп RWMutex, Ключей в map: 100000, 946.6 нс/оп RWMutex, Ключей в map: 250000, 926.3 нс/оп RWMutex, Ключей в map: 500000, 1 008.0 нс/оп RWMutex, Ключей в map: 750000, 1 018.0 нс/оп RWMutex, Ключей в map: 1000000, 909.7 нс/оп Mutex, Ключей в map: 1, 411.0 нс/оп Mutex, Ключей в map: 2, 440.2 нс/оп Mutex, Ключей в map: 4, 400.3 нс/оп Mutex, Ключей в map: 8, 416.3 нс/оп Mutex, Ключей в map: 16, 482.7 нс/оп Mutex, Ключей в map: 32, 499.6 нс/оп Mutex, Ключей в map: 64, 497.0 нс/оп Mutex, Ключей в map: 128, 568.6 нс/оп Mutex, Ключей в map: 256, 567.7 нс/оп Mutex, Ключей в map: 512, 563.9 нс/оп Mutex, Ключей в map: 1024, 648.4 нс/оп Mutex, Ключей в map: 4096, 635.5 нс/оп Mutex, Ключей в map: 16384, 716.1 нс/оп Mutex, Ключей в map: 65536, 602.2 нс/оп Mutex, Ключей в map: 100000, 855.5 нс/оп Mutex, Ключей в map: 250000, 876.5 нс/оп Mutex, Ключей в map: 500000, 944.9 нс/оп Mutex, Ключей в map: 750000, 989.2 нс/оп Mutex, Ключей в map: 1000000, 1 012.0 нс/оп SyncMap, Ключей в map: 1, 578.8 нс/оп SyncMap, Ключей в map: 2, 607.0 нс/оп SyncMap, Ключей в map: 4, 596.8 нс/оп SyncMap, Ключей в map: 8, 537.2 нс/оп SyncMap, Ключей в map: 16, 410.8 нс/оп SyncMap, Ключей в map: 32, 252.9 нс/оп SyncMap, Ключей в map: 64, 85.19 нс/оп SyncMap, Ключей в map: 128, 71.26 нс/оп SyncMap, Ключей в map: 256, 55.51 нс/оп SyncMap, Ключей в map: 512, 53.47 нс/оп SyncMap, Ключей в map: 1024, 51.83 нс/оп SyncMap, Ключей в map: 4096, 56.28 нс/оп SyncMap, Ключей в map: 16384, 52.74 нс/оп SyncMap, Ключей в map: 65536, 64.49 нс/оп SyncMap, Ключей в map: 100000, 69.08 нс/оп SyncMap, Ключей в map: 250000, 83.99 нс/оп SyncMap, Ключей в map: 500000, 91.89 нс/оп SyncMap, Ключей в map: 750000, 127.3 нс/оп SyncMap, Ключей в map: 1000000, 112.1 нс/оп Размер map, Delete + Store, P=12; медиана пяти повторов, меньше лучше Размер map при одной горутине При P=1 рабочие горутины не спорят за блокировку. Здесь лучше видны расходы на поиск и сами методы. Верхняя точка этих графиков составляет миллион ключей.
Только чтение 0 200 400 600 800 нс/оп 1 4 16 64 256 1 024 4 096 16 384 65 536 1 000 000 Ключей в map RWMutex Mutex SyncMap RWMutex, Ключей в map: 1, 12.18 нс/оп RWMutex, Ключей в map: 2, 16.69 нс/оп RWMutex, Ключей в map: 4, 19.69 нс/оп RWMutex, Ключей в map: 8, 22.89 нс/оп RWMutex, Ключей в map: 16, 17.82 нс/оп RWMutex, Ключей в map: 32, 17.78 нс/оп RWMutex, Ключей в map: 64, 17.76 нс/оп RWMutex, Ключей в map: 128, 17.01 нс/оп RWMutex, Ключей в map: 256, 17.05 нс/оп RWMutex, Ключей в map: 512, 17.7 нс/оп RWMutex, Ключей в map: 1024, 19.73 нс/оп RWMutex, Ключей в map: 4096, 20.58 нс/оп RWMutex, Ключей в map: 16384, 24.47 нс/оп RWMutex, Ключей в map: 65536, 29.75 нс/оп RWMutex, Ключей в map: 100000, 34.42 нс/оп RWMutex, Ключей в map: 250000, 84.51 нс/оп RWMutex, Ключей в map: 500000, 106.7 нс/оп RWMutex, Ключей в map: 750000, 115.4 нс/оп RWMutex, Ключей в map: 1000000, 122.0 нс/оп Mutex, Ключей в map: 1, 13.94 нс/оп Mutex, Ключей в map: 2, 18.27 нс/оп Mutex, Ключей в map: 4, 20.88 нс/оп Mutex, Ключей в map: 8, 23.39 нс/оп Mutex, Ключей в map: 16, 19.62 нс/оп Mutex, Ключей в map: 32, 19.46 нс/оп Mutex, Ключей в map: 64, 19.74 нс/оп Mutex, Ключей в map: 128, 16.92 нс/оп Mutex, Ключей в map: 256, 19.85 нс/оп Mutex, Ключей в map: 512, 19.67 нс/оп Mutex, Ключей в map: 1024, 22.21 нс/оп Mutex, Ключей в map: 4096, 20.63 нс/оп Mutex, Ключей в map: 16384, 23.35 нс/оп Mutex, Ключей в map: 65536, 30.04 нс/оп Mutex, Ключей в map: 100000, 33.58 нс/оп Mutex, Ключей в map: 250000, 83.14 нс/оп Mutex, Ключей в map: 500000, 106.1 нс/оп Mutex, Ключей в map: 750000, 116.4 нс/оп Mutex, Ключей в map: 1000000, 122.2 нс/оп SyncMap, Ключей в map: 1, 23.79 нс/оп SyncMap, Ключей в map: 2, 24.04 нс/оп SyncMap, Ключей в map: 4, 20.05 нс/оп SyncMap, Ключей в map: 8, 28.19 нс/оп SyncMap, Ключей в map: 16, 33.54 нс/оп SyncMap, Ключей в map: 32, 30.9 нс/оп SyncMap, Ключей в map: 64, 26.23 нс/оп SyncMap, Ключей в map: 128, 29.94 нс/оп SyncMap, Ключей в map: 256, 35.13 нс/оп SyncMap, Ключей в map: 512, 34.26 нс/оп SyncMap, Ключей в map: 1024, 35.74 нс/оп SyncMap, Ключей в map: 4096, 47.43 нс/оп SyncMap, Ключей в map: 16384, 64.94 нс/оп SyncMap, Ключей в map: 65536, 199.8 нс/оп SyncMap, Ключей в map: 100000, 264.6 нс/оп SyncMap, Ключей в map: 250000, 384.6 нс/оп SyncMap, Ключей в map: 500000, 419.3 нс/оп SyncMap, Ключей в map: 750000, 595.8 нс/оп SyncMap, Ключей в map: 1000000, 658.3 нс/оп 0 200 400 600 800 нс/оп 1 16 256 4 096 1 000 000 Ключей в map RWMutex Mutex SyncMap RWMutex, Ключей в map: 1, 12.18 нс/оп RWMutex, Ключей в map: 2, 16.69 нс/оп RWMutex, Ключей в map: 4, 19.69 нс/оп RWMutex, Ключей в map: 8, 22.89 нс/оп RWMutex, Ключей в map: 16, 17.82 нс/оп RWMutex, Ключей в map: 32, 17.78 нс/оп RWMutex, Ключей в map: 64, 17.76 нс/оп RWMutex, Ключей в map: 128, 17.01 нс/оп RWMutex, Ключей в map: 256, 17.05 нс/оп RWMutex, Ключей в map: 512, 17.7 нс/оп RWMutex, Ключей в map: 1024, 19.73 нс/оп RWMutex, Ключей в map: 4096, 20.58 нс/оп RWMutex, Ключей в map: 16384, 24.47 нс/оп RWMutex, Ключей в map: 65536, 29.75 нс/оп RWMutex, Ключей в map: 100000, 34.42 нс/оп RWMutex, Ключей в map: 250000, 84.51 нс/оп RWMutex, Ключей в map: 500000, 106.7 нс/оп RWMutex, Ключей в map: 750000, 115.4 нс/оп RWMutex, Ключей в map: 1000000, 122.0 нс/оп Mutex, Ключей в map: 1, 13.94 нс/оп Mutex, Ключей в map: 2, 18.27 нс/оп Mutex, Ключей в map: 4, 20.88 нс/оп Mutex, Ключей в map: 8, 23.39 нс/оп Mutex, Ключей в map: 16, 19.62 нс/оп Mutex, Ключей в map: 32, 19.46 нс/оп Mutex, Ключей в map: 64, 19.74 нс/оп Mutex, Ключей в map: 128, 16.92 нс/оп Mutex, Ключей в map: 256, 19.85 нс/оп Mutex, Ключей в map: 512, 19.67 нс/оп Mutex, Ключей в map: 1024, 22.21 нс/оп Mutex, Ключей в map: 4096, 20.63 нс/оп Mutex, Ключей в map: 16384, 23.35 нс/оп Mutex, Ключей в map: 65536, 30.04 нс/оп Mutex, Ключей в map: 100000, 33.58 нс/оп Mutex, Ключей в map: 250000, 83.14 нс/оп Mutex, Ключей в map: 500000, 106.1 нс/оп Mutex, Ключей в map: 750000, 116.4 нс/оп Mutex, Ключей в map: 1000000, 122.2 нс/оп SyncMap, Ключей в map: 1, 23.79 нс/оп SyncMap, Ключей в map: 2, 24.04 нс/оп SyncMap, Ключей в map: 4, 20.05 нс/оп SyncMap, Ключей в map: 8, 28.19 нс/оп SyncMap, Ключей в map: 16, 33.54 нс/оп SyncMap, Ключей в map: 32, 30.9 нс/оп SyncMap, Ключей в map: 64, 26.23 нс/оп SyncMap, Ключей в map: 128, 29.94 нс/оп SyncMap, Ключей в map: 256, 35.13 нс/оп SyncMap, Ключей в map: 512, 34.26 нс/оп SyncMap, Ключей в map: 1024, 35.74 нс/оп SyncMap, Ключей в map: 4096, 47.43 нс/оп SyncMap, Ключей в map: 16384, 64.94 нс/оп SyncMap, Ключей в map: 65536, 199.8 нс/оп SyncMap, Ключей в map: 100000, 264.6 нс/оп SyncMap, Ключей в map: 250000, 384.6 нс/оп SyncMap, Ключей в map: 500000, 419.3 нс/оп SyncMap, Ключей в map: 750000, 595.8 нс/оп SyncMap, Ключей в map: 1000000, 658.3 нс/оп Числовые ключи, размер map, только чтение, P=1; медиана пяти повторов, меньше лучше Десять процентов записей 0 200 400 600 800 нс/оп 1 4 16 64 256 1 024 4 096 16 384 65 536 1 000 000 Ключей в map RWMutex Mutex SyncMap RWMutex, Ключей в map: 1, 16.14 нс/оп RWMutex, Ключей в map: 2, 18.47 нс/оп RWMutex, Ключей в map: 4, 21.89 нс/оп RWMutex, Ключей в map: 8, 21.6 нс/оп RWMutex, Ключей в map: 16, 20.85 нс/оп RWMutex, Ключей в map: 32, 19.86 нс/оп RWMutex, Ключей в map: 64, 20.35 нс/оп RWMutex, Ключей в map: 128, 20.03 нс/оп RWMutex, Ключей в map: 256, 17.22 нс/оп RWMutex, Ключей в map: 512, 20.41 нс/оп RWMutex, Ключей в map: 1024, 21.4 нс/оп RWMutex, Ключей в map: 4096, 23.09 нс/оп RWMutex, Ключей в map: 16384, 25.29 нс/оп RWMutex, Ключей в map: 65536, 31.89 нс/оп RWMutex, Ключей в map: 100000, 36.96 нс/оп RWMutex, Ключей в map: 250000, 91.2 нс/оп RWMutex, Ключей в map: 500000, 113.0 нс/оп RWMutex, Ключей в map: 750000, 121.0 нс/оп RWMutex, Ключей в map: 1000000, 127.3 нс/оп Mutex, Ключей в map: 1, 13.19 нс/оп Mutex, Ключей в map: 2, 19.6 нс/оп Mutex, Ключей в map: 4, 22.36 нс/оп Mutex, Ключей в map: 8, 24.53 нс/оп Mutex, Ключей в map: 16, 21.57 нс/оп Mutex, Ключей в map: 32, 21.66 нс/оп Mutex, Ключей в map: 64, 22.06 нс/оп Mutex, Ключей в map: 128, 18.42 нс/оп Mutex, Ключей в map: 256, 21.81 нс/оп Mutex, Ключей в map: 512, 22.36 нс/оп Mutex, Ключей в map: 1024, 19.01 нс/оп Mutex, Ключей в map: 4096, 23.1 нс/оп Mutex, Ключей в map: 16384, 26.44 нс/оп Mutex, Ключей в map: 65536, 28.53 нс/оп Mutex, Ключей в map: 100000, 35.83 нс/оп Mutex, Ключей в map: 250000, 89.02 нс/оп Mutex, Ключей в map: 500000, 111.4 нс/оп Mutex, Ключей в map: 750000, 121.5 нс/оп Mutex, Ключей в map: 1000000, 125.1 нс/оп SyncMap, Ключей в map: 1, 31.94 нс/оп SyncMap, Ключей в map: 2, 31.55 нс/оп SyncMap, Ключей в map: 4, 33.75 нс/оп SyncMap, Ключей в map: 8, 34.39 нс/оп SyncMap, Ключей в map: 16, 40.17 нс/оп SyncMap, Ключей в map: 32, 39.04 нс/оп SyncMap, Ключей в map: 64, 37.55 нс/оп SyncMap, Ключей в map: 128, 41.14 нс/оп SyncMap, Ключей в map: 256, 43.53 нс/оп SyncMap, Ключей в map: 512, 36.91 нс/оп SyncMap, Ключей в map: 1024, 41.74 нс/оп SyncMap, Ключей в map: 4096, 53.75 нс/оп SyncMap, Ключей в map: 16384, 88.8 нс/оп SyncMap, Ключей в map: 65536, 251.7 нс/оп SyncMap, Ключей в map: 100000, 289.7 нс/оп SyncMap, Ключей в map: 250000, 441.6 нс/оп SyncMap, Ключей в map: 500000, 537.4 нс/оп SyncMap, Ключей в map: 750000, 646.4 нс/оп SyncMap, Ключей в map: 1000000, 663.5 нс/оп 0 200 400 600 800 нс/оп 1 16 256 4 096 1 000 000 Ключей в map RWMutex Mutex SyncMap RWMutex, Ключей в map: 1, 16.14 нс/оп RWMutex, Ключей в map: 2, 18.47 нс/оп RWMutex, Ключей в map: 4, 21.89 нс/оп RWMutex, Ключей в map: 8, 21.6 нс/оп RWMutex, Ключей в map: 16, 20.85 нс/оп RWMutex, Ключей в map: 32, 19.86 нс/оп RWMutex, Ключей в map: 64, 20.35 нс/оп RWMutex, Ключей в map: 128, 20.03 нс/оп RWMutex, Ключей в map: 256, 17.22 нс/оп RWMutex, Ключей в map: 512, 20.41 нс/оп RWMutex, Ключей в map: 1024, 21.4 нс/оп RWMutex, Ключей в map: 4096, 23.09 нс/оп RWMutex, Ключей в map: 16384, 25.29 нс/оп RWMutex, Ключей в map: 65536, 31.89 нс/оп RWMutex, Ключей в map: 100000, 36.96 нс/оп RWMutex, Ключей в map: 250000, 91.2 нс/оп RWMutex, Ключей в map: 500000, 113.0 нс/оп RWMutex, Ключей в map: 750000, 121.0 нс/оп RWMutex, Ключей в map: 1000000, 127.3 нс/оп Mutex, Ключей в map: 1, 13.19 нс/оп Mutex, Ключей в map: 2, 19.6 нс/оп Mutex, Ключей в map: 4, 22.36 нс/оп Mutex, Ключей в map: 8, 24.53 нс/оп Mutex, Ключей в map: 16, 21.57 нс/оп Mutex, Ключей в map: 32, 21.66 нс/оп Mutex, Ключей в map: 64, 22.06 нс/оп Mutex, Ключей в map: 128, 18.42 нс/оп Mutex, Ключей в map: 256, 21.81 нс/оп Mutex, Ключей в map: 512, 22.36 нс/оп Mutex, Ключей в map: 1024, 19.01 нс/оп Mutex, Ключей в map: 4096, 23.1 нс/оп Mutex, Ключей в map: 16384, 26.44 нс/оп Mutex, Ключей в map: 65536, 28.53 нс/оп Mutex, Ключей в map: 100000, 35.83 нс/оп Mutex, Ключей в map: 250000, 89.02 нс/оп Mutex, Ключей в map: 500000, 111.4 нс/оп Mutex, Ключей в map: 750000, 121.5 нс/оп Mutex, Ключей в map: 1000000, 125.1 нс/оп SyncMap, Ключей в map: 1, 31.94 нс/оп SyncMap, Ключей в map: 2, 31.55 нс/оп SyncMap, Ключей в map: 4, 33.75 нс/оп SyncMap, Ключей в map: 8, 34.39 нс/оп SyncMap, Ключей в map: 16, 40.17 нс/оп SyncMap, Ключей в map: 32, 39.04 нс/оп SyncMap, Ключей в map: 64, 37.55 нс/оп SyncMap, Ключей в map: 128, 41.14 нс/оп SyncMap, Ключей в map: 256, 43.53 нс/оп SyncMap, Ключей в map: 512, 36.91 нс/оп SyncMap, Ключей в map: 1024, 41.74 нс/оп SyncMap, Ключей в map: 4096, 53.75 нс/оп SyncMap, Ключей в map: 16384, 88.8 нс/оп SyncMap, Ключей в map: 65536, 251.7 нс/оп SyncMap, Ключей в map: 100000, 289.7 нс/оп SyncMap, Ключей в map: 250000, 441.6 нс/оп SyncMap, Ключей в map: 500000, 537.4 нс/оп SyncMap, Ключей в map: 750000, 646.4 нс/оп SyncMap, Ключей в map: 1000000, 663.5 нс/оп Числовые ключи, размер map, десять процентов записей, P=1; медиана пяти повторов, меньше лучше Половина записей 0 500 1 000 нс/оп 1 4 16 64 256 1 024 4 096 16 384 65 536 1 000 000 Ключей в map RWMutex Mutex SyncMap RWMutex, Ключей в map: 1, 25.0 нс/оп RWMutex, Ключей в map: 2, 23.36 нс/оп RWMutex, Ключей в map: 4, 28.32 нс/оп RWMutex, Ключей в map: 8, 30.76 нс/оп RWMutex, Ключей в map: 16, 25.29 нс/оп RWMutex, Ключей в map: 32, 28.7 нс/оп RWMutex, Ключей в map: 64, 29.8 нс/оп RWMutex, Ключей в map: 128, 31.01 нс/оп RWMutex, Ключей в map: 256, 30.09 нс/оп RWMutex, Ключей в map: 512, 31.65 нс/оп RWMutex, Ключей в map: 1024, 29.74 нс/оп RWMutex, Ключей в map: 4096, 30.53 нс/оп RWMutex, Ключей в map: 16384, 32.75 нс/оп RWMutex, Ключей в map: 65536, 37.15 нс/оп RWMutex, Ключей в map: 100000, 39.56 нс/оп RWMutex, Ключей в map: 250000, 104.9 нс/оп RWMutex, Ключей в map: 500000, 127.1 нс/оп RWMutex, Ключей в map: 750000, 133.7 нс/оп RWMutex, Ключей в map: 1000000, 139.7 нс/оп Mutex, Ключей в map: 1, 21.25 нс/оп Mutex, Ключей в map: 2, 24.91 нс/оп Mutex, Ключей в map: 4, 26.12 нс/оп Mutex, Ключей в map: 8, 27.65 нс/оп Mutex, Ключей в map: 16, 28.0 нс/оп Mutex, Ключей в map: 32, 24.11 нс/оп Mutex, Ключей в map: 64, 28.44 нс/оп Mutex, Ключей в map: 128, 28.44 нс/оп Mutex, Ключей в map: 256, 30.28 нс/оп Mutex, Ключей в map: 512, 28.59 нс/оп Mutex, Ключей в map: 1024, 28.93 нс/оп Mutex, Ключей в map: 4096, 24.86 нс/оп Mutex, Ключей в map: 16384, 30.59 нс/оп Mutex, Ключей в map: 65536, 36.89 нс/оп Mutex, Ключей в map: 100000, 36.95 нс/оп Mutex, Ключей в map: 250000, 98.96 нс/оп Mutex, Ключей в map: 500000, 121.2 нс/оп Mutex, Ключей в map: 750000, 129.1 нс/оп Mutex, Ключей в map: 1000000, 134.0 нс/оп SyncMap, Ключей в map: 1, 60.65 нс/оп SyncMap, Ключей в map: 2, 60.79 нс/оп SyncMap, Ключей в map: 4, 67.73 нс/оп SyncMap, Ключей в map: 8, 58.91 нс/оп SyncMap, Ключей в map: 16, 72.56 нс/оп SyncMap, Ключей в map: 32, 58.86 нс/оп SyncMap, Ключей в map: 64, 66.22 нс/оп SyncMap, Ключей в map: 128, 69.92 нс/оп SyncMap, Ключей в map: 256, 72.81 нс/оп SyncMap, Ключей в map: 512, 78.1 нс/оп SyncMap, Ключей в map: 1024, 69.91 нс/оп SyncMap, Ключей в map: 4096, 104.7 нс/оп SyncMap, Ключей в map: 16384, 163.6 нс/оп SyncMap, Ключей в map: 65536, 386.7 нс/оп SyncMap, Ключей в map: 100000, 441.1 нс/оп SyncMap, Ключей в map: 250000, 492.7 нс/оп SyncMap, Ключей в map: 500000, 745.7 нс/оп SyncMap, Ключей в map: 750000, 835.3 нс/оп SyncMap, Ключей в map: 1000000, 907.9 нс/оп 0 500 1 000 нс/оп 1 16 256 4 096 1 000 000 Ключей в map RWMutex Mutex SyncMap RWMutex, Ключей в map: 1, 25.0 нс/оп RWMutex, Ключей в map: 2, 23.36 нс/оп RWMutex, Ключей в map: 4, 28.32 нс/оп RWMutex, Ключей в map: 8, 30.76 нс/оп RWMutex, Ключей в map: 16, 25.29 нс/оп RWMutex, Ключей в map: 32, 28.7 нс/оп RWMutex, Ключей в map: 64, 29.8 нс/оп RWMutex, Ключей в map: 128, 31.01 нс/оп RWMutex, Ключей в map: 256, 30.09 нс/оп RWMutex, Ключей в map: 512, 31.65 нс/оп RWMutex, Ключей в map: 1024, 29.74 нс/оп RWMutex, Ключей в map: 4096, 30.53 нс/оп RWMutex, Ключей в map: 16384, 32.75 нс/оп RWMutex, Ключей в map: 65536, 37.15 нс/оп RWMutex, Ключей в map: 100000, 39.56 нс/оп RWMutex, Ключей в map: 250000, 104.9 нс/оп RWMutex, Ключей в map: 500000, 127.1 нс/оп RWMutex, Ключей в map: 750000, 133.7 нс/оп RWMutex, Ключей в map: 1000000, 139.7 нс/оп Mutex, Ключей в map: 1, 21.25 нс/оп Mutex, Ключей в map: 2, 24.91 нс/оп Mutex, Ключей в map: 4, 26.12 нс/оп Mutex, Ключей в map: 8, 27.65 нс/оп Mutex, Ключей в map: 16, 28.0 нс/оп Mutex, Ключей в map: 32, 24.11 нс/оп Mutex, Ключей в map: 64, 28.44 нс/оп Mutex, Ключей в map: 128, 28.44 нс/оп Mutex, Ключей в map: 256, 30.28 нс/оп Mutex, Ключей в map: 512, 28.59 нс/оп Mutex, Ключей в map: 1024, 28.93 нс/оп Mutex, Ключей в map: 4096, 24.86 нс/оп Mutex, Ключей в map: 16384, 30.59 нс/оп Mutex, Ключей в map: 65536, 36.89 нс/оп Mutex, Ключей в map: 100000, 36.95 нс/оп Mutex, Ключей в map: 250000, 98.96 нс/оп Mutex, Ключей в map: 500000, 121.2 нс/оп Mutex, Ключей в map: 750000, 129.1 нс/оп Mutex, Ключей в map: 1000000, 134.0 нс/оп SyncMap, Ключей в map: 1, 60.65 нс/оп SyncMap, Ключей в map: 2, 60.79 нс/оп SyncMap, Ключей в map: 4, 67.73 нс/оп SyncMap, Ключей в map: 8, 58.91 нс/оп SyncMap, Ключей в map: 16, 72.56 нс/оп SyncMap, Ключей в map: 32, 58.86 нс/оп SyncMap, Ключей в map: 64, 66.22 нс/оп SyncMap, Ключей в map: 128, 69.92 нс/оп SyncMap, Ключей в map: 256, 72.81 нс/оп SyncMap, Ключей в map: 512, 78.1 нс/оп SyncMap, Ключей в map: 1024, 69.91 нс/оп SyncMap, Ключей в map: 4096, 104.7 нс/оп SyncMap, Ключей в map: 16384, 163.6 нс/оп SyncMap, Ключей в map: 65536, 386.7 нс/оп SyncMap, Ключей в map: 100000, 441.1 нс/оп SyncMap, Ключей в map: 250000, 492.7 нс/оп SyncMap, Ключей в map: 500000, 745.7 нс/оп SyncMap, Ключей в map: 750000, 835.3 нс/оп SyncMap, Ключей в map: 1000000, 907.9 нс/оп Числовые ключи, размер map, половина записей, P=1; медиана пяти повторов, меньше лучше Размер map со строковыми ключами Теперь ключи строковые. В каждой строке 20 байт. Они созданы до теста. На линиях по 19 размеров от одного ключа до миллиона, P=12.
Только чтение 0 200 400 600 800 нс/оп 1 4 16 64 256 1 024 4 096 16 384 65 536 1 000 000 Ключей в map RWMutex Mutex SyncMap RWMutex, Ключей в map: 1, 37.84 нс/оп RWMutex, Ключей в map: 2, 37.1 нс/оп RWMutex, Ключей в map: 4, 37.8 нс/оп RWMutex, Ключей в map: 8, 38.69 нс/оп RWMutex, Ключей в map: 16, 38.06 нс/оп RWMutex, Ключей в map: 32, 37.91 нс/оп RWMutex, Ключей в map: 64, 37.88 нс/оп RWMutex, Ключей в map: 128, 40.79 нс/оп RWMutex, Ключей в map: 256, 40.18 нс/оп RWMutex, Ключей в map: 512, 41.15 нс/оп RWMutex, Ключей в map: 1024, 36.89 нс/оп RWMutex, Ключей в map: 4096, 36.6 нс/оп RWMutex, Ключей в map: 16384, 37.56 нс/оп RWMutex, Ключей в map: 65536, 40.65 нс/оп RWMutex, Ключей в map: 100000, 41.88 нс/оп RWMutex, Ключей в map: 250000, 47.26 нс/оп RWMutex, Ключей в map: 500000, 49.73 нс/оп RWMutex, Ключей в map: 750000, 50.64 нс/оп RWMutex, Ключей в map: 1000000, 55.16 нс/оп Mutex, Ключей в map: 1, 164.9 нс/оп Mutex, Ключей в map: 2, 182.5 нс/оп Mutex, Ключей в map: 4, 183.2 нс/оп Mutex, Ключей в map: 8, 208.5 нс/оп Mutex, Ключей в map: 16, 154.8 нс/оп Mutex, Ключей в map: 32, 152.1 нс/оп Mutex, Ключей в map: 64, 167.1 нс/оп Mutex, Ключей в map: 128, 163.6 нс/оп Mutex, Ключей в map: 256, 160.1 нс/оп Mutex, Ключей в map: 512, 181.3 нс/оп Mutex, Ключей в map: 1024, 199.9 нс/оп Mutex, Ключей в map: 4096, 217.0 нс/оп Mutex, Ключей в map: 16384, 256.2 нс/оп Mutex, Ключей в map: 65536, 421.1 нс/оп Mutex, Ключей в map: 100000, 468.4 нс/оп Mutex, Ключей в map: 250000, 497.6 нс/оп Mutex, Ключей в map: 500000, 551.2 нс/оп Mutex, Ключей в map: 750000, 593.9 нс/оп Mutex, Ключей в map: 1000000, 647.4 нс/оп SyncMap, Ключей в map: 1, 4.23 нс/оп SyncMap, Ключей в map: 2, 4.28 нс/оп SyncMap, Ключей в map: 4, 4.65 нс/оп SyncMap, Ключей в map: 8, 4.43 нс/оп SyncMap, Ключей в map: 16, 4.63 нс/оп SyncMap, Ключей в map: 32, 4.55 нс/оп SyncMap, Ключей в map: 64, 4.74 нс/оп SyncMap, Ключей в map: 128, 5.11 нс/оп SyncMap, Ключей в map: 256, 5.24 нс/оп SyncMap, Ключей в map: 512, 5.2 нс/оп SyncMap, Ключей в map: 1024, 5.61 нс/оп SyncMap, Ключей в map: 4096, 6.94 нс/оп SyncMap, Ключей в map: 16384, 8.96 нс/оп SyncMap, Ключей в map: 65536, 29.75 нс/оп SyncMap, Ключей в map: 100000, 36.94 нс/оп SyncMap, Ключей в map: 250000, 48.71 нс/оп SyncMap, Ключей в map: 500000, 54.34 нс/оп SyncMap, Ключей в map: 750000, 59.15 нс/оп SyncMap, Ключей в map: 1000000, 62.21 нс/оп 0 200 400 600 800 нс/оп 1 16 256 4 096 1 000 000 Ключей в map RWMutex Mutex SyncMap RWMutex, Ключей в map: 1, 37.84 нс/оп RWMutex, Ключей в map: 2, 37.1 нс/оп RWMutex, Ключей в map: 4, 37.8 нс/оп RWMutex, Ключей в map: 8, 38.69 нс/оп RWMutex, Ключей в map: 16, 38.06 нс/оп RWMutex, Ключей в map: 32, 37.91 нс/оп RWMutex, Ключей в map: 64, 37.88 нс/оп RWMutex, Ключей в map: 128, 40.79 нс/оп RWMutex, Ключей в map: 256, 40.18 нс/оп RWMutex, Ключей в map: 512, 41.15 нс/оп RWMutex, Ключей в map: 1024, 36.89 нс/оп RWMutex, Ключей в map: 4096, 36.6 нс/оп RWMutex, Ключей в map: 16384, 37.56 нс/оп RWMutex, Ключей в map: 65536, 40.65 нс/оп RWMutex, Ключей в map: 100000, 41.88 нс/оп RWMutex, Ключей в map: 250000, 47.26 нс/оп RWMutex, Ключей в map: 500000, 49.73 нс/оп RWMutex, Ключей в map: 750000, 50.64 нс/оп RWMutex, Ключей в map: 1000000, 55.16 нс/оп Mutex, Ключей в map: 1, 164.9 нс/оп Mutex, Ключей в map: 2, 182.5 нс/оп Mutex, Ключей в map: 4, 183.2 нс/оп Mutex, Ключей в map: 8, 208.5 нс/оп Mutex, Ключей в map: 16, 154.8 нс/оп Mutex, Ключей в map: 32, 152.1 нс/оп Mutex, Ключей в map: 64, 167.1 нс/оп Mutex, Ключей в map: 128, 163.6 нс/оп Mutex, Ключей в map: 256, 160.1 нс/оп Mutex, Ключей в map: 512, 181.3 нс/оп Mutex, Ключей в map: 1024, 199.9 нс/оп Mutex, Ключей в map: 4096, 217.0 нс/оп Mutex, Ключей в map: 16384, 256.2 нс/оп Mutex, Ключей в map: 65536, 421.1 нс/оп Mutex, Ключей в map: 100000, 468.4 нс/оп Mutex, Ключей в map: 250000, 497.6 нс/оп Mutex, Ключей в map: 500000, 551.2 нс/оп Mutex, Ключей в map: 750000, 593.9 нс/оп Mutex, Ключей в map: 1000000, 647.4 нс/оп SyncMap, Ключей в map: 1, 4.23 нс/оп SyncMap, Ключей в map: 2, 4.28 нс/оп SyncMap, Ключей в map: 4, 4.65 нс/оп SyncMap, Ключей в map: 8, 4.43 нс/оп SyncMap, Ключей в map: 16, 4.63 нс/оп SyncMap, Ключей в map: 32, 4.55 нс/оп SyncMap, Ключей в map: 64, 4.74 нс/оп SyncMap, Ключей в map: 128, 5.11 нс/оп SyncMap, Ключей в map: 256, 5.24 нс/оп SyncMap, Ключей в map: 512, 5.2 нс/оп SyncMap, Ключей в map: 1024, 5.61 нс/оп SyncMap, Ключей в map: 4096, 6.94 нс/оп SyncMap, Ключей в map: 16384, 8.96 нс/оп SyncMap, Ключей в map: 65536, 29.75 нс/оп SyncMap, Ключей в map: 100000, 36.94 нс/оп SyncMap, Ключей в map: 250000, 48.71 нс/оп SyncMap, Ключей в map: 500000, 54.34 нс/оп SyncMap, Ключей в map: 750000, 59.15 нс/оп SyncMap, Ключей в map: 1000000, 62.21 нс/оп Строки по 20 байт, размер map, только чтение, P=12; медиана пяти повторов, меньше лучше Десять процентов записей 0 200 400 600 800 нс/оп 1 4 16 64 256 1 024 4 096 16 384 65 536 1 000 000 Ключей в map RWMutex Mutex SyncMap RWMutex, Ключей в map: 1, 80.69 нс/оп RWMutex, Ключей в map: 2, 102.4 нс/оп RWMutex, Ключей в map: 4, 142.5 нс/оп RWMutex, Ключей в map: 8, 132.0 нс/оп RWMutex, Ключей в map: 16, 105.4 нс/оп RWMutex, Ключей в map: 32, 105.7 нс/оп RWMutex, Ключей в map: 64, 102.2 нс/оп RWMutex, Ключей в map: 128, 96.67 нс/оп RWMutex, Ключей в map: 256, 108.1 нс/оп RWMutex, Ключей в map: 512, 124.0 нс/оп RWMutex, Ключей в map: 1024, 144.0 нс/оп RWMutex, Ключей в map: 4096, 138.0 нс/оп RWMutex, Ключей в map: 16384, 165.6 нс/оп RWMutex, Ключей в map: 65536, 298.6 нс/оп RWMutex, Ключей в map: 100000, 338.2 нс/оп RWMutex, Ключей в map: 250000, 444.7 нс/оп RWMutex, Ключей в map: 500000, 485.8 нс/оп RWMutex, Ключей в map: 750000, 485.4 нс/оп RWMutex, Ключей в map: 1000000, 501.4 нс/оп Mutex, Ключей в map: 1, 194.7 нс/оп Mutex, Ключей в map: 2, 203.9 нс/оп Mutex, Ключей в map: 4, 221.3 нс/оп Mutex, Ключей в map: 8, 222.2 нс/оп Mutex, Ключей в map: 16, 201.4 нс/оп Mutex, Ключей в map: 32, 205.0 нс/оп Mutex, Ключей в map: 64, 207.4 нс/оп Mutex, Ключей в map: 128, 215.6 нс/оп Mutex, Ключей в map: 256, 215.6 нс/оп Mutex, Ключей в map: 512, 229.4 нс/оп Mutex, Ключей в map: 1024, 249.6 нс/оп Mutex, Ключей в map: 4096, 232.0 нс/оп Mutex, Ключей в map: 16384, 305.5 нс/оп Mutex, Ключей в map: 65536, 421.3 нс/оп Mutex, Ключей в map: 100000, 476.2 нс/оп Mutex, Ключей в map: 250000, 514.6 нс/оп Mutex, Ключей в map: 500000, 581.7 нс/оп Mutex, Ключей в map: 750000, 589.7 нс/оп Mutex, Ключей в map: 1000000, 621.8 нс/оп SyncMap, Ключей в map: 1, 91.34 нс/оп SyncMap, Ключей в map: 2, 76.36 нс/оп SyncMap, Ключей в map: 4, 92.84 нс/оп SyncMap, Ключей в map: 8, 73.96 нс/оп SyncMap, Ключей в map: 16, 40.58 нс/оп SyncMap, Ключей в map: 32, 17.75 нс/оп SyncMap, Ключей в map: 64, 15.27 нс/оп SyncMap, Ключей в map: 128, 14.27 нс/оп SyncMap, Ключей в map: 256, 12.89 нс/оп SyncMap, Ключей в map: 512, 11.87 нс/оп SyncMap, Ключей в map: 1024, 12.11 нс/оп SyncMap, Ключей в map: 4096, 13.5 нс/оп SyncMap, Ключей в map: 16384, 17.46 нс/оп SyncMap, Ключей в map: 65536, 38.01 нс/оп SyncMap, Ключей в map: 100000, 44.25 нс/оп SyncMap, Ключей в map: 250000, 56.34 нс/оп SyncMap, Ключей в map: 500000, 62.62 нс/оп SyncMap, Ключей в map: 750000, 61.73 нс/оп SyncMap, Ключей в map: 1000000, 73.91 нс/оп 0 200 400 600 800 нс/оп 1 16 256 4 096 1 000 000 Ключей в map RWMutex Mutex SyncMap RWMutex, Ключей в map: 1, 80.69 нс/оп RWMutex, Ключей в map: 2, 102.4 нс/оп RWMutex, Ключей в map: 4, 142.5 нс/оп RWMutex, Ключей в map: 8, 132.0 нс/оп RWMutex, Ключей в map: 16, 105.4 нс/оп RWMutex, Ключей в map: 32, 105.7 нс/оп RWMutex, Ключей в map: 64, 102.2 нс/оп RWMutex, Ключей в map: 128, 96.67 нс/оп RWMutex, Ключей в map: 256, 108.1 нс/оп RWMutex, Ключей в map: 512, 124.0 нс/оп RWMutex, Ключей в map: 1024, 144.0 нс/оп RWMutex, Ключей в map: 4096, 138.0 нс/оп RWMutex, Ключей в map: 16384, 165.6 нс/оп RWMutex, Ключей в map: 65536, 298.6 нс/оп RWMutex, Ключей в map: 100000, 338.2 нс/оп RWMutex, Ключей в map: 250000, 444.7 нс/оп RWMutex, Ключей в map: 500000, 485.8 нс/оп RWMutex, Ключей в map: 750000, 485.4 нс/оп RWMutex, Ключей в map: 1000000, 501.4 нс/оп Mutex, Ключей в map: 1, 194.7 нс/оп Mutex, Ключей в map: 2, 203.9 нс/оп Mutex, Ключей в map: 4, 221.3 нс/оп Mutex, Ключей в map: 8, 222.2 нс/оп Mutex, Ключей в map: 16, 201.4 нс/оп Mutex, Ключей в map: 32, 205.0 нс/оп Mutex, Ключей в map: 64, 207.4 нс/оп Mutex, Ключей в map: 128, 215.6 нс/оп Mutex, Ключей в map: 256, 215.6 нс/оп Mutex, Ключей в map: 512, 229.4 нс/оп Mutex, Ключей в map: 1024, 249.6 нс/оп Mutex, Ключей в map: 4096, 232.0 нс/оп Mutex, Ключей в map: 16384, 305.5 нс/оп Mutex, Ключей в map: 65536, 421.3 нс/оп Mutex, Ключей в map: 100000, 476.2 нс/оп Mutex, Ключей в map: 250000, 514.6 нс/оп Mutex, Ключей в map: 500000, 581.7 нс/оп Mutex, Ключей в map: 750000, 589.7 нс/оп Mutex, Ключей в map: 1000000, 621.8 нс/оп SyncMap, Ключей в map: 1, 91.34 нс/оп SyncMap, Ключей в map: 2, 76.36 нс/оп SyncMap, Ключей в map: 4, 92.84 нс/оп SyncMap, Ключей в map: 8, 73.96 нс/оп SyncMap, Ключей в map: 16, 40.58 нс/оп SyncMap, Ключей в map: 32, 17.75 нс/оп SyncMap, Ключей в map: 64, 15.27 нс/оп SyncMap, Ключей в map: 128, 14.27 нс/оп SyncMap, Ключей в map: 256, 12.89 нс/оп SyncMap, Ключей в map: 512, 11.87 нс/оп SyncMap, Ключей в map: 1024, 12.11 нс/оп SyncMap, Ключей в map: 4096, 13.5 нс/оп SyncMap, Ключей в map: 16384, 17.46 нс/оп SyncMap, Ключей в map: 65536, 38.01 нс/оп SyncMap, Ключей в map: 100000, 44.25 нс/оп SyncMap, Ключей в map: 250000, 56.34 нс/оп SyncMap, Ключей в map: 500000, 62.62 нс/оп SyncMap, Ключей в map: 750000, 61.73 нс/оп SyncMap, Ключей в map: 1000000, 73.91 нс/оп Строки по 20 байт, размер map, десять процентов записей, P=12; медиана пяти повторов, меньше лучше Половина записей 0 200 400 600 800 нс/оп 1 4 16 64 256 1 024 4 096 16 384 65 536 1 000 000 Ключей в map RWMutex Mutex SyncMap RWMutex, Ключей в map: 1, 109.9 нс/оп RWMutex, Ключей в map: 2, 107.1 нс/оп RWMutex, Ключей в map: 4, 124.2 нс/оп RWMutex, Ключей в map: 8, 125.5 нс/оп RWMutex, Ключей в map: 16, 109.6 нс/оп RWMutex, Ключей в map: 32, 106.2 нс/оп RWMutex, Ключей в map: 64, 113.6 нс/оп RWMutex, Ключей в map: 128, 113.1 нс/оп RWMutex, Ключей в map: 256, 120.9 нс/оп RWMutex, Ключей в map: 512, 120.7 нс/оп RWMutex, Ключей в map: 1024, 137.7 нс/оп RWMutex, Ключей в map: 4096, 189.3 нс/оп RWMutex, Ключей в map: 16384, 229.6 нс/оп RWMutex, Ключей в map: 65536, 329.2 нс/оп RWMutex, Ключей в map: 100000, 324.1 нс/оп RWMutex, Ключей в map: 250000, 430.6 нс/оп RWMutex, Ключей в map: 500000, 480.6 нс/оп RWMutex, Ключей в map: 750000, 504.0 нс/оп RWMutex, Ключей в map: 1000000, 517.1 нс/оп Mutex, Ключей в map: 1, 226.8 нс/оп Mutex, Ключей в map: 2, 234.7 нс/оп Mutex, Ключей в map: 4, 261.9 нс/оп Mutex, Ключей в map: 8, 236.3 нс/оп Mutex, Ключей в map: 16, 246.8 нс/оп Mutex, Ключей в map: 32, 247.0 нс/оп Mutex, Ключей в map: 64, 252.2 нс/оп Mutex, Ключей в map: 128, 273.8 нс/оп Mutex, Ключей в map: 256, 287.4 нс/оп Mutex, Ключей в map: 512, 312.9 нс/оп Mutex, Ключей в map: 1024, 370.7 нс/оп Mutex, Ключей в map: 4096, 370.9 нс/оп Mutex, Ключей в map: 16384, 382.7 нс/оп Mutex, Ключей в map: 65536, 522.6 нс/оп Mutex, Ключей в map: 100000, 518.8 нс/оп Mutex, Ключей в map: 250000, 631.4 нс/оп Mutex, Ключей в map: 500000, 626.4 нс/оп Mutex, Ключей в map: 750000, 669.7 нс/оп Mutex, Ключей в map: 1000000, 696.4 нс/оп SyncMap, Ключей в map: 1, 269.8 нс/оп SyncMap, Ключей в map: 2, 291.6 нс/оп SyncMap, Ключей в map: 4, 241.6 нс/оп SyncMap, Ключей в map: 8, 236.4 нс/оп SyncMap, Ключей в map: 16, 189.0 нс/оп SyncMap, Ключей в map: 32, 61.23 нс/оп SyncMap, Ключей в map: 64, 43.74 нс/оп SyncMap, Ключей в map: 128, 39.34 нс/оп SyncMap, Ключей в map: 256, 33.9 нс/оп SyncMap, Ключей в map: 512, 31.79 нс/оп SyncMap, Ключей в map: 1024, 31.81 нс/оп SyncMap, Ключей в map: 4096, 34.03 нс/оп SyncMap, Ключей в map: 16384, 35.2 нс/оп SyncMap, Ключей в map: 65536, 55.83 нс/оп SyncMap, Ключей в map: 100000, 61.67 нс/оп SyncMap, Ключей в map: 250000, 77.36 нс/оп SyncMap, Ключей в map: 500000, 81.53 нс/оп SyncMap, Ключей в map: 750000, 110.7 нс/оп SyncMap, Ключей в map: 1000000, 126.7 нс/оп 0 200 400 600 800 нс/оп 1 16 256 4 096 1 000 000 Ключей в map RWMutex Mutex SyncMap RWMutex, Ключей в map: 1, 109.9 нс/оп RWMutex, Ключей в map: 2, 107.1 нс/оп RWMutex, Ключей в map: 4, 124.2 нс/оп RWMutex, Ключей в map: 8, 125.5 нс/оп RWMutex, Ключей в map: 16, 109.6 нс/оп RWMutex, Ключей в map: 32, 106.2 нс/оп RWMutex, Ключей в map: 64, 113.6 нс/оп RWMutex, Ключей в map: 128, 113.1 нс/оп RWMutex, Ключей в map: 256, 120.9 нс/оп RWMutex, Ключей в map: 512, 120.7 нс/оп RWMutex, Ключей в map: 1024, 137.7 нс/оп RWMutex, Ключей в map: 4096, 189.3 нс/оп RWMutex, Ключей в map: 16384, 229.6 нс/оп RWMutex, Ключей в map: 65536, 329.2 нс/оп RWMutex, Ключей в map: 100000, 324.1 нс/оп RWMutex, Ключей в map: 250000, 430.6 нс/оп RWMutex, Ключей в map: 500000, 480.6 нс/оп RWMutex, Ключей в map: 750000, 504.0 нс/оп RWMutex, Ключей в map: 1000000, 517.1 нс/оп Mutex, Ключей в map: 1, 226.8 нс/оп Mutex, Ключей в map: 2, 234.7 нс/оп Mutex, Ключей в map: 4, 261.9 нс/оп Mutex, Ключей в map: 8, 236.3 нс/оп Mutex, Ключей в map: 16, 246.8 нс/оп Mutex, Ключей в map: 32, 247.0 нс/оп Mutex, Ключей в map: 64, 252.2 нс/оп Mutex, Ключей в map: 128, 273.8 нс/оп Mutex, Ключей в map: 256, 287.4 нс/оп Mutex, Ключей в map: 512, 312.9 нс/оп Mutex, Ключей в map: 1024, 370.7 нс/оп Mutex, Ключей в map: 4096, 370.9 нс/оп Mutex, Ключей в map: 16384, 382.7 нс/оп Mutex, Ключей в map: 65536, 522.6 нс/оп Mutex, Ключей в map: 100000, 518.8 нс/оп Mutex, Ключей в map: 250000, 631.4 нс/оп Mutex, Ключей в map: 500000, 626.4 нс/оп Mutex, Ключей в map: 750000, 669.7 нс/оп Mutex, Ключей в map: 1000000, 696.4 нс/оп SyncMap, Ключей в map: 1, 269.8 нс/оп SyncMap, Ключей в map: 2, 291.6 нс/оп SyncMap, Ключей в map: 4, 241.6 нс/оп SyncMap, Ключей в map: 8, 236.4 нс/оп SyncMap, Ключей в map: 16, 189.0 нс/оп SyncMap, Ключей в map: 32, 61.23 нс/оп SyncMap, Ключей в map: 64, 43.74 нс/оп SyncMap, Ключей в map: 128, 39.34 нс/оп SyncMap, Ключей в map: 256, 33.9 нс/оп SyncMap, Ключей в map: 512, 31.79 нс/оп SyncMap, Ключей в map: 1024, 31.81 нс/оп SyncMap, Ключей в map: 4096, 34.03 нс/оп SyncMap, Ключей в map: 16384, 35.2 нс/оп SyncMap, Ключей в map: 65536, 55.83 нс/оп SyncMap, Ключей в map: 100000, 61.67 нс/оп SyncMap, Ключей в map: 250000, 77.36 нс/оп SyncMap, Ключей в map: 500000, 81.53 нс/оп SyncMap, Ключей в map: 750000, 110.7 нс/оп SyncMap, Ключей в map: 1000000, 126.7 нс/оп Строки по 20 байт, размер map, половина записей, P=12; медиана пяти повторов, меньше лучше Обращения к горячим ключам В map лежат 4096 ключей. Горутины обращаются только к первым K ключам. Меняем K от 1 до 4096, шанс записи всегда равен 50%.
При K=1 все делят один ключ. При K=4096 обращения идут по всей map. Внутри выбранного набора ключи равновероятны. Остальные вообще не используются. Это отдельная модель нагрузки, без распределения Zipf или правила 80/20.
0 100 200 300 400 нс/оп 1 2 4 8 16 64 256 4 096 Ключей в горячем наборе RWMutex Mutex SyncMap RWMutex, Ключей в горячем наборе: 1, 95.34 нс/оп 95.34 RWMutex, Ключей в горячем наборе: 2, 102.3 нс/оп 102.3 RWMutex, Ключей в горячем наборе: 4, 97.75 нс/оп 97.75 RWMutex, Ключей в горячем наборе: 8, 100.8 нс/оп 100.8 RWMutex, Ключей в горячем наборе: 16, 100.0 нс/оп 100.0 RWMutex, Ключей в горячем наборе: 64, 105.6 нс/оп 105.6 RWMutex, Ключей в горячем наборе: 256, 118.8 нс/оп 118.8 RWMutex, Ключей в горячем наборе: 4096, 160.1 нс/оп 160.1 Mutex, Ключей в горячем наборе: 1, 203.6 нс/оп 203.6 Mutex, Ключей в горячем наборе: 2, 211.1 нс/оп 211.1 Mutex, Ключей в горячем наборе: 4, 195.5 нс/оп 195.5 Mutex, Ключей в горячем наборе: 8, 211.9 нс/оп 211.9 Mutex, Ключей в горячем наборе: 16, 233.4 нс/оп 233.4 Mutex, Ключей в горячем наборе: 64, 260.1 нс/оп 260.1 Mutex, Ключей в горячем наборе: 256, 267.6 нс/оп 267.6 Mutex, Ключей в горячем наборе: 4096, 310.3 нс/оп 310.3 SyncMap, Ключей в горячем наборе: 1, 254.8 нс/оп 254.8 SyncMap, Ключей в горячем наборе: 2, 217.6 нс/оп SyncMap, Ключей в горячем наборе: 4, 105.1 нс/оп SyncMap, Ключей в горячем наборе: 8, 72.37 нс/оп 72.37 SyncMap, Ключей в горячем наборе: 16, 46.91 нс/оп SyncMap, Ключей в горячем наборе: 64, 33.99 нс/оп 33.99 SyncMap, Ключей в горячем наборе: 256, 29.22 нс/оп 29.22 SyncMap, Ключей в горячем наборе: 4096, 30.96 нс/оп 30.96 0 100 200 300 400 нс/оп 1 4 16 64 256 4 096 Ключей в горячем наборе RWMutex Mutex SyncMap RWMutex, Ключей в горячем наборе: 1, 95.34 нс/оп RWMutex, Ключей в горячем наборе: 2, 102.3 нс/оп RWMutex, Ключей в горячем наборе: 4, 97.75 нс/оп RWMutex, Ключей в горячем наборе: 8, 100.8 нс/оп RWMutex, Ключей в горячем наборе: 16, 100.0 нс/оп RWMutex, Ключей в горячем наборе: 64, 105.6 нс/оп RWMutex, Ключей в горячем наборе: 256, 118.8 нс/оп RWMutex, Ключей в горячем наборе: 4096, 160.1 нс/оп Mutex, Ключей в горячем наборе: 1, 203.6 нс/оп Mutex, Ключей в горячем наборе: 2, 211.1 нс/оп Mutex, Ключей в горячем наборе: 4, 195.5 нс/оп Mutex, Ключей в горячем наборе: 8, 211.9 нс/оп Mutex, Ключей в горячем наборе: 16, 233.4 нс/оп Mutex, Ключей в горячем наборе: 64, 260.1 нс/оп Mutex, Ключей в горячем наборе: 256, 267.6 нс/оп Mutex, Ключей в горячем наборе: 4096, 310.3 нс/оп SyncMap, Ключей в горячем наборе: 1, 254.8 нс/оп SyncMap, Ключей в горячем наборе: 2, 217.6 нс/оп SyncMap, Ключей в горячем наборе: 4, 105.1 нс/оп SyncMap, Ключей в горячем наборе: 8, 72.37 нс/оп SyncMap, Ключей в горячем наборе: 16, 46.91 нс/оп SyncMap, Ключей в горячем наборе: 64, 33.99 нс/оп SyncMap, Ключей в горячем наборе: 256, 29.22 нс/оп SyncMap, Ключей в горячем наборе: 4096, 30.96 нс/оп Горячий набор в map из 4096 элементов, 50% Store, P=12; медиана пяти повторов, меньше лучше На одном горячем ключе RWMutex показал 95,34 нс/оп, Mutex 203,6, SyncMap 254,8. На восьми у SyncMap уже 72,37 нс/оп, у RWMutex 100,8, у Mutex 211,9. При K=4096 числа составили 30,96, 160,1 и 310,3 нс/оп в том же порядке. Разброс повторов есть в CSV.
Строковые ключи: чтение Здесь размер фиксирован: 4096 строк. Меняется число горутин. Тест считает время поиска и сравнения строк. Создание строк через fmt.Sprintf вынесено за таймер.
0 100 200 300 нс/оп 1 2 3 4 6 8 12 Исполнителей (GOMAXPROCS) RWMutex Mutex SyncMap RWMutex, Исполнителей (GOMAXPROCS): 1, 26.66 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 2, 43.09 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 3, 52.34 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 4, 61.4 нс/оп 61.4 RWMutex, Исполнителей (GOMAXPROCS): 6, 51.9 нс/оп 51.9 RWMutex, Исполнителей (GOMAXPROCS): 8, 43.62 нс/оп 43.62 RWMutex, Исполнителей (GOMAXPROCS): 12, 38.16 нс/оп 38.16 Mutex, Исполнителей (GOMAXPROCS): 1, 27.09 нс/оп Mutex, Исполнителей (GOMAXPROCS): 2, 66.98 нс/оп 66.98 Mutex, Исполнителей (GOMAXPROCS): 3, 94.61 нс/оп 94.61 Mutex, Исполнителей (GOMAXPROCS): 4, 109.3 нс/оп 109.3 Mutex, Исполнителей (GOMAXPROCS): 6, 161.1 нс/оп 161.1 Mutex, Исполнителей (GOMAXPROCS): 8, 198.7 нс/оп 198.7 Mutex, Исполнителей (GOMAXPROCS): 12, 223.1 нс/оп 223.1 SyncMap, Исполнителей (GOMAXPROCS): 1, 61.89 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 2, 29.01 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 3, 18.57 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 4, 14.27 нс/оп 14.27 SyncMap, Исполнителей (GOMAXPROCS): 6, 10.03 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 8, 8.39 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 12, 7.02 нс/оп 0 100 200 300 нс/оп 1 3 6 8 12 Исполнителей (GOMAXPROCS) RWMutex Mutex SyncMap RWMutex, Исполнителей (GOMAXPROCS): 1, 26.66 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 2, 43.09 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 3, 52.34 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 4, 61.4 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 6, 51.9 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 8, 43.62 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 12, 38.16 нс/оп Mutex, Исполнителей (GOMAXPROCS): 1, 27.09 нс/оп Mutex, Исполнителей (GOMAXPROCS): 2, 66.98 нс/оп Mutex, Исполнителей (GOMAXPROCS): 3, 94.61 нс/оп Mutex, Исполнителей (GOMAXPROCS): 4, 109.3 нс/оп Mutex, Исполнителей (GOMAXPROCS): 6, 161.1 нс/оп Mutex, Исполнителей (GOMAXPROCS): 8, 198.7 нс/оп Mutex, Исполнителей (GOMAXPROCS): 12, 223.1 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 1, 61.89 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 2, 29.01 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 3, 18.57 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 4, 14.27 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 6, 10.03 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 8, 8.39 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 12, 7.02 нс/оп Строки по 20 байт, 100% Load, 4096 ключей; медиана пяти повторов, меньше лучше Строковые ключи: десять процентов записей Обычные map имеют тип map[string]*value. В sync.Map строка передаётся через any. Затраты на это тоже входят в замер. Их след можно увидеть в B/op.
0 100 200 300 нс/оп 1 2 3 4 6 8 12 Исполнителей (GOMAXPROCS) RWMutex Mutex SyncMap RWMutex, Исполнителей (GOMAXPROCS): 1, 25.19 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 2, 101.3 нс/оп 101.3 RWMutex, Исполнителей (GOMAXPROCS): 3, 138.2 нс/оп 138.2 RWMutex, Исполнителей (GOMAXPROCS): 4, 141.6 нс/оп 141.6 RWMutex, Исполнителей (GOMAXPROCS): 6, 133.0 нс/оп 133.0 RWMutex, Исполнителей (GOMAXPROCS): 8, 159.4 нс/оп 159.4 RWMutex, Исполнителей (GOMAXPROCS): 12, 177.5 нс/оп 177.5 Mutex, Исполнителей (GOMAXPROCS): 1, 28.79 нс/оп Mutex, Исполнителей (GOMAXPROCS): 2, 106.9 нс/оп 106.9 Mutex, Исполнителей (GOMAXPROCS): 3, 102.5 нс/оп 102.5 Mutex, Исполнителей (GOMAXPROCS): 4, 165.4 нс/оп 165.4 Mutex, Исполнителей (GOMAXPROCS): 6, 199.0 нс/оп 199.0 Mutex, Исполнителей (GOMAXPROCS): 8, 219.7 нс/оп 219.7 Mutex, Исполнителей (GOMAXPROCS): 12, 261.4 нс/оп 261.4 SyncMap, Исполнителей (GOMAXPROCS): 1, 80.5 нс/оп 80.5 SyncMap, Исполнителей (GOMAXPROCS): 2, 49.66 нс/оп 49.66 SyncMap, Исполнителей (GOMAXPROCS): 3, 33.98 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 4, 24.57 нс/оп 24.57 SyncMap, Исполнителей (GOMAXPROCS): 6, 17.23 нс/оп 17.23 SyncMap, Исполнителей (GOMAXPROCS): 8, 14.84 нс/оп 14.84 SyncMap, Исполнителей (GOMAXPROCS): 12, 13.86 нс/оп 13.86 0 100 200 300 нс/оп 1 3 6 8 12 Исполнителей (GOMAXPROCS) RWMutex Mutex SyncMap RWMutex, Исполнителей (GOMAXPROCS): 1, 25.19 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 2, 101.3 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 3, 138.2 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 4, 141.6 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 6, 133.0 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 8, 159.4 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 12, 177.5 нс/оп Mutex, Исполнителей (GOMAXPROCS): 1, 28.79 нс/оп Mutex, Исполнителей (GOMAXPROCS): 2, 106.9 нс/оп Mutex, Исполнителей (GOMAXPROCS): 3, 102.5 нс/оп Mutex, Исполнителей (GOMAXPROCS): 4, 165.4 нс/оп Mutex, Исполнителей (GOMAXPROCS): 6, 199.0 нс/оп Mutex, Исполнителей (GOMAXPROCS): 8, 219.7 нс/оп Mutex, Исполнителей (GOMAXPROCS): 12, 261.4 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 1, 80.5 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 2, 49.66 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 3, 33.98 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 4, 24.57 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 6, 17.23 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 8, 14.84 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 12, 13.86 нс/оп Строки по 20 байт, 10% Store, 4096 ключей; медиана пяти повторов, меньше лучше Строковые ключи: половина записей Последний тест скорости даёт строкам 50% записей. У всех строк одна длина и общий префикс. Для длинных URL или строк разной длины нужны свои замеры.
0 100 200 300 400 нс/оп 1 2 3 4 6 8 12 Исполнителей (GOMAXPROCS) RWMutex Mutex SyncMap RWMutex, Исполнителей (GOMAXPROCS): 1, 37.36 нс/оп 37.36 RWMutex, Исполнителей (GOMAXPROCS): 2, 149.4 нс/оп 149.4 RWMutex, Исполнителей (GOMAXPROCS): 3, 187.8 нс/оп 187.8 RWMutex, Исполнителей (GOMAXPROCS): 4, 176.1 нс/оп 176.1 RWMutex, Исполнителей (GOMAXPROCS): 6, 180.4 нс/оп 180.4 RWMutex, Исполнителей (GOMAXPROCS): 8, 168.2 нс/оп 168.2 RWMutex, Исполнителей (GOMAXPROCS): 12, 202.8 нс/оп 202.8 Mutex, Исполнителей (GOMAXPROCS): 1, 32.05 нс/оп Mutex, Исполнителей (GOMAXPROCS): 2, 121.7 нс/оп Mutex, Исполнителей (GOMAXPROCS): 3, 131.6 нс/оп Mutex, Исполнителей (GOMAXPROCS): 4, 212.5 нс/оп 212.5 Mutex, Исполнителей (GOMAXPROCS): 6, 264.6 нс/оп 264.6 Mutex, Исполнителей (GOMAXPROCS): 8, 315.1 нс/оп 315.1 Mutex, Исполнителей (GOMAXPROCS): 12, 331.8 нс/оп 331.8 SyncMap, Исполнителей (GOMAXPROCS): 1, 112.0 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 2, 97.64 нс/оп 97.64 SyncMap, Исполнителей (GOMAXPROCS): 3, 74.69 нс/оп 74.69 SyncMap, Исполнителей (GOMAXPROCS): 4, 54.48 нс/оп 54.48 SyncMap, Исполнителей (GOMAXPROCS): 6, 39.99 нс/оп 39.99 SyncMap, Исполнителей (GOMAXPROCS): 8, 35.69 нс/оп 35.69 SyncMap, Исполнителей (GOMAXPROCS): 12, 34.03 нс/оп 34.03 0 100 200 300 400 нс/оп 1 3 6 8 12 Исполнителей (GOMAXPROCS) RWMutex Mutex SyncMap RWMutex, Исполнителей (GOMAXPROCS): 1, 37.36 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 2, 149.4 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 3, 187.8 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 4, 176.1 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 6, 180.4 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 8, 168.2 нс/оп RWMutex, Исполнителей (GOMAXPROCS): 12, 202.8 нс/оп Mutex, Исполнителей (GOMAXPROCS): 1, 32.05 нс/оп Mutex, Исполнителей (GOMAXPROCS): 2, 121.7 нс/оп Mutex, Исполнителей (GOMAXPROCS): 3, 131.6 нс/оп Mutex, Исполнителей (GOMAXPROCS): 4, 212.5 нс/оп Mutex, Исполнителей (GOMAXPROCS): 6, 264.6 нс/оп Mutex, Исполнителей (GOMAXPROCS): 8, 315.1 нс/оп Mutex, Исполнителей (GOMAXPROCS): 12, 331.8 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 1, 112.0 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 2, 97.64 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 3, 74.69 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 4, 54.48 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 6, 39.99 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 8, 35.69 нс/оп SyncMap, Исполнителей (GOMAXPROCS): 12, 34.03 нс/оп Строки по 20 байт, 50% Store, 4096 ключей; медиана пяти повторов, меньше лучше Сколько ключей помещается в RAM На машине около 30,6 ГиБ RAM. Перед проверкой было доступно около 22,5 ГиБ. Лимита памяти у cgroup процесса не было. Swap в расчёт не включал: работа с ним меняет скорость теста.
Память измерил отдельно на 1 и 5 млн ключей. Каждый случай запускал в новом процессе. После GC снял живой heap: память, которая осталась занятой. Пик RSS взял из VmHWM в /proc/self/status. Это максимум RAM, которую занимал процесс. Поле описано в документации Linux .
В heap входят map, массив ключей и один общий объект значения. Каждая запись ссылается на этот объект. В вашем приложении значения могут занимать гораздо больше места.
Живой heap после GC 1 млн, uint64
RWMutex: 43,7 МиБ
Mutex: 43,7 МиБ
SyncMap: 116,0 МиБ
1 млн, string
RWMutex: 91,5 МиБ
Mutex: 91,5 МиБ
SyncMap: 154,1 МиБ
5 млн, uint64
RWMutex: 182,5 МиБ
Mutex: 182,5 МиБ
SyncMap: 568,9 МиБ
5 млн, string
RWMutex: 404,1 МиБ
Mutex: 404,1 МиБ
SyncMap: 759,8 МиБ
182,5 0 260 520 780 МиБ
0 390 780 МиБ
Живой heap заполненной таблицы и массива ключей; МиБ, меньше лучше 1 млн, uint64
RWMutex: 48,2 МиБ
Mutex: 48,3 МиБ
SyncMap: 128,0 МиБ
1 млн, string
RWMutex: 101,8 МиБ
Mutex: 101,7 МиБ
SyncMap: 168,4 МиБ
5 млн, uint64
RWMutex: 187,5 МиБ
Mutex: 187,4 МиБ
SyncMap: 611,4 МиБ
5 млн, string
RWMutex: 437,9 МиБ
Mutex: 437,7 МиБ
SyncMap: 813,0 МиБ
101,8 0 280 560 840 МиБ
0 420 840 МиБ
Пик RSS при подготовке таблицы; МиБ, меньше лучше На 5 млн строковых ключей SyncMap занял около 159 байт heap на ключ. В эту цену входит и массив ключей. Если умножить эту цену на 50 млн, получится около 7,4 ГиБ.
Это оценка по измеренной точке. Сам предел в 50 млн я не проверял. Для обновлений и GC нужен запас RAM. У обычной map расход на ключ тоже может меняться с размером таблицы.
На этой машине можно отдельно проверить память для 30–50 млн маленьких записей. В тестах скорости я дошёл до 10 млн. Если каждое значение хранит свою строку или буфер, ключей поместится меньше.
Проверить память можно так:
$ go build -o /tmp/sync-map-memory ./cmd/memory
$ /tmp/sync-map-memory -n 5000000 -kind string -impl SyncMap
Числа всех 12 случаев есть в results/memory.json. Объём живой таблицы и аллокации на одну операцию измеряют разные вещи.
Сколько памяти выделяют операции B/op показывает, сколько байт в среднем выделено за итерацию. allocs/op показывает число аллокаций. Заполнение map до начала теста в эти числа не входит.
Чтение, 4096 ключей
RWMutex: 0 Б/оп
Mutex: 0 Б/оп
SyncMap: 0 Б/оп
10% Store, 4096 ключей
RWMutex: 0 Б/оп
Mutex: 0 Б/оп
SyncMap: 5 Б/оп
100% Store, 4096 ключей
RWMutex: 0 Б/оп
Mutex: 0 Б/оп
SyncMap: 55 Б/оп
Delete + Store, 4096 ключей
RWMutex: 0 Б/оп
Mutex: 0 Б/оп
SyncMap: 55 Б/оп
Строки, 50% Store, 4096 ключей
RWMutex: 0 Б/оп
Mutex: 0 Б/оп
SyncMap: 32 Б/оп
50% Store, 1 млн ключей
RWMutex: 0 Б/оп
Mutex: 0 Б/оп
SyncMap: 27 Б/оп
50% Store, 10 млн ключей
RWMutex: 0 Б/оп
Mutex: 0 Б/оп
SyncMap: 27 Б/оп
0,0 0 20 40 60 Б/оп
0 30 60 Б/оп
Аллокации во время операций, P=12; медиана пяти повторов, Б/оп, меньше лучше У Mutex и RWMutex на этих нагрузках получилось 0 B/op. У SyncMap записи выделяют память. Например, при 100% Store тест показал 55 B/op. Это ещё одна цена, которую стоит проверить в сервисе.
В выводе go test число allocs/op целое. Если аллокация есть лишь на части шагов, вывод может показать ноль. Ненулевой B/op при таком нуле всё ещё означает, что память выделялась.
Что защищает блокировка Все три варианта защищают обращения к map. После Load вы получаете указатель на объект. Чтобы менять его поля из разных горутин, нужна своя защита. В тесте поля объектов не меняются. Про защиту отдельных значений писал в статье о sync/atomic .
Два безопасных вызова тоже могут дать ошибку. Здесь обе горутины могут прочитать одно число. Каждая прибавит единицу и запишет тот же результат:
// Фрагмент с ошибкой: несколько горутин могут прочитать одно значение.
v , _ := m .Load ("counter" )
m .Store ("counter" , v .(int )+ 1 )
С обычной map можно держать Lock от чтения до конца записи. Для sync.Map подойдёт CAS-цикл или отдельный атомарный счётчик. Выбор зависит от задачи. Эти способы в тест не входят.
LoadOrStore тоже не обещает один вызов функции загрузки. В m.LoadOrStore(key, expensive()) сначала вызывается expensive(). Только потом сам метод. Несколько горутин могут выполнить одну и ту же дорогую работу.
Метод Range не даёт снимок map на один момент времени. Во время обхода другие горутины могут менять значения. Это описано в документации Range . Если нужно согласованно менять несколько ключей, обычная map под общим Lock часто проще.
Как устроены тесты Все замеры сделаны 9 ноября 2026 года. Машина: AMD Ryzen 5 PRO 4650U, 6 ядер, 12 аппаратных потоков. Система Linux, amd64. Версия Go 1.27.3, GOEXPERIMENT пустой. Архив Go скачан с go.dev, его контрольная сумма совпала с указанной на сайте.
Нагрузку запускает testing.B.RunParallel. Рабочие значения P: 1, 2, 3, 4, 6, 8 и 12. Вместе с P меняется число горутин. Случай со ста горутинами на одном P здесь не проверялся.
Тест Что меняется Остальные условия Число горутин 7 значений P, 9 нагрузок Обычно 4096 ключей Размер, числовые ключи 19 размеров, 6 нагрузок P=12; чтение, 10/50/100% записей, промахи, Delete+Store Большие таблицы Ещё 3, 5 и 10 млн ключей P=12; 0/10/50% записей Размер при одной горутине 19 размеров P=1; 0/10/50% записей Размер, строки 19 размеров P=12; 0/10/50% записей Доля записей 11 значений от 1% до 100% P=12, 4096 ключей Горячие ключи 8 наборов от 1 до 4096 ключей P=12, 50% записей Строки и число горутин 7 значений P 4096 ключей; 0/10/50% записей
Основные размеры: 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 4096, 16384, 65536, 100000, 250000, 500000, 750000 и 1000000 ключей. В трёх числовых нагрузках добавлены 3000000, 5000000 и 10000000. В них по 22 точки на линию. В остальных тестах размера по 19.
Всего 340 наборов условий. Умножаем на три реализации и пять повторов. Получаем 1020 конфигураций и 5100 измерений. Все три варианта прошли один полный прогон.
Ключи, строки и значения создаются до таймера. Заполнение map тоже вынесено за него. Для обычного теста готовится N ключей. Для промахов 2N, для отдельных наборов N ключей на горутину. Лишних ключей в массиве нет.
Все варианты вызываются через один интерфейс: Load, Store, Delete, LoadOrStore. Расходы на этот вызов входят в результат. Как и выбор операции, хеширование и работа блокировки.
На всех тестах порядок вариантов фиксирован. Частоты CPU и работа планировщика тоже могут влиять на числа. Пять повторов по 150 мс не доказывают устойчивый выигрыш в пару процентов.
Как тест выбирает ключ У каждой горутины свой генератор xorshift. Для всех обычных тестов индекс считается так:
func keyIndex (r uint64 , n int ) int {
return int((uint64(uint32(r )) * uint64(n )) >> 32 )
}
Формула берёт младшие 32 бита и выбирает индекс от 0 до N−1. Она работает и для миллиона ключей. При наших размерах каждый индекс достижим. Число исходных значений на один индекс может отличаться на единицу. Поэтому выбор почти равномерный.
Маска r & (N-1) годится только для размеров, равных степени двойки. Здесь она осталась лишь у горячего набора. Старшие биты генератора выбирают чтение или запись.
Шанс записи проверяется на каждом шаге. При 10% записей короткий отрезок может дать и другую долю. Жёсткого порядка «девять чтений, одна запись» в коде нет.
Что проверяет сводка Скрипт ждёт все 1020 конфигураций, по пять повторов каждой. Замеры с числом итераций меньше 10000 он отклоняет. В CSV остаются медиана, минимум, максимум и число итераций.
После теста таймер выключается до возврата прежнего GOMAXPROCS. Смена P может ждать GC. Это ожидание в цену map не входит.
Суффикс -12 в сыром выводе относится к внешней настройке testing. Число P для нагрузки задано внутри теста. Например, parallel/read/4/RWMutex работает с P=4.
Версия sync.Map В Go 1.24 sync.Map получил другую реализацию. В Go 1.27.3 внутри него используется HashTrieMap. Старые разборы через read и dirty к этим тестам не подходят. Изменение описано в примечаниях Go 1.24 .
Документация sync.Map выделяет два случая: ключ записан один раз и часто читается; либо горутины работают с разными наборами ключей. В большинстве задач она советует обычную map с блокировкой. Так проще задать типы и вместе с map защитить другие данные.
Как повторить замеры В архиве есть map_test.go, go.mod, скрипт сводки и каталог results. Для Go-кода хватает стандартной библиотеки.
$ go version
go version go1.27.3 linux/amd64
$ go test -race ./...
$ go test -run '^$' -bench . -benchmem -benchtime= 150ms -count= 5 -timeout= 2h > results/raw.txt
$ python3 summarize.py
Мой полный прогон занял около 52 минут. Большие map перед каждым замером заполняются заново. Это входит во время команды, но исключено из ns/op. Поэтому таймаут увеличен до двух часов.
Детектор гонок запускается отдельно через -race. Он проверяет работу обёрток. Скорость измеряется без него.
Чтобы проверить близкие числа, увеличьте время теста и число повторов. Например, для чтения при восьми горутинах:
$ go test -run '^$' -bench '^BenchmarkMaps$/^parallel$/^read$/^8$' -benchmem -benchtime= 2s -count= 10
Для миллиона ключей с 50% записей:
$ go test -run '^$' -bench '^BenchmarkMaps$/^size$/^w50$/^1000000$' -benchmem -benchtime= 2s -count= 10 -timeout= 2h
Вывод отдельной серии сохраните в другой файл. Скрипт сводки ждёт в raw.txt полный набор. Подробнее о выборе теста писал в статье о бенчмарках Go .
Здесь не проверены постоянный рост map, Range, большие значения и работа внутри блокировки. Нет шардированной map, задержек p95/p99 и теста при нехватке RAM.
Итог В моих замерах выбор меняется с нагрузкой. На чтении 4096 ключей при P=12 быстрее SyncMap. На чтении 10 млн ключей быстрее RWMutex. На одном ключе со смесью 50/50 тоже RWMutex.
Я бы начал с обычной map и блокировки под свою задачу. Затем сравнил Mutex, RWMutex и sync.Map на своих ключах. Размер таблицы, горячие ключи и время под блокировкой важны не меньше доли записей.
Последний шаг: измерить весь сервис. Если map занимает малую часть времени запроса, выигрыш на ней мало изменит итоговую скорость.