ainu
map с указанным размером - быстрее на чтение
ainu
блин красота
ainu
надо написать функцию appendMap(map,key,value)
ainu
которая в фиксированный размером Map добавляет элемент ИЛИ создает новую копию (пусть медленно) с большим размером
Timur
Timur
Ну мап без размера будет реалоцироваться по мере добавления ключей
Timur
Что в этом странного?
ainu
Я хочу получить более быстрые на чтение map-ы за счет указания размера и не упираться в лимит за счет своей функции
ainu
да нет ничего странного. В тесте то у меня нет добавления ключей. Только поиск по существующим
ainu
в этом то вся соль. Он оптимизированней
ainu
Я должен задать этот вопрос. Никто не писал случайно такую функцию appendToMap?
Timur
А можете еще раз прислать свой тест
Timur
ainu
А что она должна делать?
myMap := make(map[int]int, 3)
myMap = appendMap(myMap, 1,2)
myMap = appendMap(myMap, 2,5)
myMap = appendMap(myMap, 9,10)
// <- вот тут myMap пересоздается с размером 4 или 5 или 10 (с запасом)
myMap = appendMap(myMap, 99,30)
myMap = appendMap(myMap, 13,70)
ainu
ainu
Только там ещё в тесте есть гугловый Btree, его можно и нужно выпилить
ainu
оставить только бенчмарки
ainu
если искать по памяти, он медленней всех
ainu
хер там, appendToMap должна знать структуру (тип) мапы, иначе её придется писать для каждого мапа заново
ainu
или как то думать про interface{}
Alexey
myMap := make(map[int]int, 3)
myMap = appendMap(myMap, 1,2)
myMap = appendMap(myMap, 2,5)
myMap = appendMap(myMap, 9,10)
// <- вот тут myMap пересоздается с размером 4 или 5 или 10 (с запасом)
myMap = appendMap(myMap, 99,30)
myMap = appendMap(myMap, 13,70)
Делайте типизированные функции, вы всегда же знаете тип мапы, так вызывайте соответствующую.
ainu
ха, append в мапу с указанным размером без ошибок её увеличивает.
ainu
но при этом она становится медленнее=)
Andrei 🦉
ну ты же указываешь не конечный размер мапы, а на сколько элементов нужно преаллоцировать памяти
Andrei 🦉
у слайса тоже самое
Timur
ainu
именно при чтении
Timur
Это заблуждение
Timur
Ну ты конечно можешь найти такой случай
Timur
Но в общем случае разницы нет
ainu
ainu
Тогда где я не прав? чистый бенчмарк уже ничего лишнего
ainu
на 40 процентов быстрее
Timur
Неправ в написании теста
Timur
b.ResetTimer()
Timur
Перед for n := 0; n < b.N; n++ {
Timur
Но ты прав, что-то в этом есть)
Vasilii
Andrei 🦉
не совсем понимаю, как избыточный размер может замедлять чтение мапы?
Andrei 🦉
коллизия хешей? не коррелирует с избыточным размером
Andrei 🦉
может там есть какая нибудь хитрая оптимизация при заранее известном размере мапы?
Andrei 🦉
есть знающие люди?
Timur
Там есть хитрое говнище про oldbuckets и evacute например
Timur
При реалокации к примеру не все бакеты сразу переезжают в новое место
Andrei 🦉
типа переезжают, только когда на их элементы операция read попадает и это замедляет чтение?
Alexey
Timur
ainu
ainu
Timur
Откуда alloc?
ainu
а я хз
ainu
func BenchmarkSpeedMap(b *testing.B) {
tree2 := map[int]int{}
for i := 4; i < 450000; i++ {
tree2[i] = i * 10
}
secondids := []int{}
for i := 4; i < 450000; i = i + 2 {
secondids = append(secondids, i)
}
b.ResetTimer()
for n := 0; n < b.N; n++ {
result := make([]int, 0, len(secondids))
for i := 0; i <= len(secondids)-1; i++ {
if res, exists := tree2[secondids[i]]; exists && res > 20 && res < 410000 {
result = append(result, res)
}
}
}
}
ainu
могу переменные выбласти вглобальную область и предварительно инициировать
朝の日差し ✙
Valentin
朝の日差し ✙
😅😅 Вспоминая одну фразу - что бы просить работодателя, надо найти работодателя
Hopf
Timur
Timur
Хм
Timur
BenchmarkSpeedMap-4 100 23142364 ns/op 1802240 B/op 1 allocs/op
BenchmarkSpeedMapWithSize-4 100 17854946 ns/op 1802240 B/op 1 allocs/op
Timur
Есть какое-то влияние, evacute в том числе, но небольшое. Что там еще влияет, нужно посмотреть подетальнее
Vasily
Timur
Ну тут вопрос то не в ускорении, а в механике. Без понимаю "почему?!!!" это не интересно))
Timur
Пока существенную разницу видно только в этом
ainu
Почему я уже задавал
Timur
2.25s 35.83% 35.83% 2.40s 38.22% runtime.mapaccess2_fast64 /usr/local/Cellar/go/1.9.2/libexec/src/runtime/hashmap_fast.go
2.23s 35.51% 71.34% 2.23s 35.51% runtime.mapaccess2_fast64 /usr/local/Cellar/go/1.9.2/libexec/src/runtime/hashmap.go
Timur
vs
Timur
3.28s 69.05% 69.05% 3.62s 76.21% runtime.mapaccess2_fast64 /usr/local/Cellar/go/1.9.2/libexec/src/runtime/hashmap_fast.go
ainu
А как аллоки убрал до одного?
Timur
b.ResetTimer()
for n := 0; n < b.N; n++ {
ainu
Или там можно как и время в ноль сбросить?
Timur
В обеих функциях
ainu
Таймер аллоки тоже сбрасывает?
Timur
Таймер сбрасывает замеры
ainu
Отлично
ainu
Надо под линуксом ещё померить