ainu
map с указанным размером - быстрее на чтение
ainu
блин красота
ainu
надо написать функцию appendMap(map,key,value)
ainu
которая в фиксированный размером Map добавляет элемент ИЛИ создает новую копию (пусть медленно) с большим размером
Timur
Ну мап без размера будет реалоцироваться по мере добавления ключей
Timur
Что в этом странного?
ainu
Я хочу получить более быстрые на чтение map-ы за счет указания размера и не упираться в лимит за счет своей функции
ainu
да нет ничего странного. В тесте то у меня нет добавления ключей. Только поиск по существующим
ainu
в этом то вся соль. Он оптимизированней
ainu
Я должен задать этот вопрос. Никто не писал случайно такую функцию appendToMap?
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
Только там ещё в тесте есть гугловый Btree, его можно и нужно выпилить
ainu
оставить только бенчмарки
ainu
если искать по памяти, он медленней всех
ainu
хер там, appendToMap должна знать структуру (тип) мапы, иначе её придется писать для каждого мапа заново
ainu
или как то думать про interface{}
ainu
ха, append в мапу с указанным размером без ошибок её увеличивает.
ainu
но при этом она становится медленнее=)
Andrei 🦉
ну ты же указываешь не конечный размер мапы, а на сколько элементов нужно преаллоцировать памяти
Andrei 🦉
у слайса тоже самое
ainu
А при чем тут чтение и указание размера?
Если у мапа предварительный размер указан большой - она работает быстрее при чтении судя по тестам
ainu
именно при чтении
Timur
Это заблуждение
Timur
Ну ты конечно можешь найти такой случай
Timur
Но в общем случае разницы нет
ainu
ainu
Тогда где я не прав? чистый бенчмарк уже ничего лишнего
ainu
на 40 процентов быстрее
Timur
Неправ в написании теста
Timur
b.ResetTimer()
Timur
Перед for n := 0; n < b.N; n++ {
Timur
Но ты прав, что-то в этом есть)
Andrei 🦉
не совсем понимаю, как избыточный размер может замедлять чтение мапы?
Andrei 🦉
коллизия хешей? не коррелирует с избыточным размером
Andrei 🦉
может там есть какая нибудь хитрая оптимизация при заранее известном размере мапы?
Andrei 🦉
есть знающие люди?
Timur
Там есть хитрое говнище про oldbuckets и evacute например
Timur
При реалокации к примеру не все бакеты сразу переезжают в новое место
Andrei 🦉
типа переезжают, только когда на их элементы операция read попадает и это замедляет чтение?
ainu
b.ResetTimer()
сделал
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
Классно, но блин, 80$ за проверку заданек...
Попроси оплатить работодателя
朝の日差し ✙
😅😅 Вспоминая одну фразу - что бы просить работодателя, надо найти работодателя
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
Классно, но блин, 80$ за проверку заданек...
там хорошие задания. я старался сделать их такими чтобы платный сертификат был не пустым звуком, а реально давал какие-то знания
Vasily
Спасибо большое за курс. Тоже подписался. Пока вольным слушателем
пожалуйста! надеюсь поможет в работе в каик-то местах
Hopf
пожалуйста! надеюсь поможет в работе в каик-то местах
С учетом того, что я только устроился junior golang developer, поможет)
ainu
Есть какое-то влияние, evacute в том числе, но небольшое. Что там еще влияет, нужно посмотреть подетальнее
Домой приеду, сделаю обычный слайс который в итоге копируется в лимитный, и честный замер, а также исключить работу с массивом, чтобы чисто время слайсов замерить. Если все нормально будет, результаты в гитхабе опубликую. В целом меня возможность на 40% ускориться очень радует
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
Надо под линуксом ещё померить