директор интернета
ладно извините больше не буду (ладно пизжу буду)
директор интернета
благодарю
computer scientist
Gleb
map[bool]func(){ true: func() {}, false: func() {}, }[CONDITION]()
Если я увижу это в своём кудривью я найду тебя
директор интернета
Dmitriy
))
с дженериками поигрался, теперь берись за интерфейсы и заворачивание слайсов в лаваши из них же))
директор интернета
добавил в прод, жду повышения
я это написал как раз после прочтения гиста "things to commit before leaving your job"
директор интернета
https://gist.github.com/aras-p/6224951
директор интернета
а какой смысл i и j? не очень понимаю
меняет два случайных элемента в слайсе местами
Артем
меняет два случайных элемента в слайсе местами
ну вот я не понял смысла этого действия) просто рофл типа?
директор интернета
именно
директор интернета
иначе смысл этой функции был бы только в том чтобы обойти работу аппенда (а он удваивает размер внутреннего массива в два раза если не хватает капасити)
директор интернета
правда в целом и то и другое аллокация так что без понятия вообще зачем таким заниматься
Dmitriy
Не-а
Да.
Herman
Одну мифологию перебили другой мифологией. Такая вот инженерия
Dmitriy
1.25 * oldCap + 192
Herman
Да.
А почему если cap 17, то после аппенда будет 36, а не 34? Говорю про int
Dmitriy
Потому что рост зависит еще от типа.
Dmitriy
На разных интах будет разная аппроксимация.
Herman
1.25 * oldCap + 192
Блин, у тебя в канале «разбираемся с GC», но ты даже со слайсом не можешь разобраться
Herman
Потому что рост зависит еще от типа.
А где это в твоей формуле?
Dmitriy
В углу посиди и потокси.
Dmitriy
Поплакать можешь посидеть еще.
Herman
Вот такие вот инженеры пошли
noi
Не-а
https://github.com/golang/go/blob/master/src/runtime/slice.go#L289 // nextslicecap computes the next appropriate slice length. func nextslicecap(newLen, oldCap int) int { newcap := oldCap doublecap := newcap + newcap if newLen > doublecap { return newLen } const threshold = 256 if oldCap < threshold { return doublecap } for { // Transition from growing 2x for small slices // to growing 1.25x for large slices. This formula // gives a smooth-ish transition between the two. newcap += (newcap + 3*threshold) >> 2 // We need to check `newcap >= newLen` and whether `newcap` overflowed. // newLen is guaranteed to be larger than zero, hence // when newcap overflows then `uint(newcap) > uint(newLen)`. // This allows to check for both with the same comparison. if uint(newcap) >= uint(newLen) { break } } // Set newcap to the requested cap when // the newcap calculation overflowed. if newcap <= 0 { return newLen } return newcap }
Dmitriy
Чота Herman молчит 🙂
Dmitriy
В сорсы полез…
Herman
В сорсы полез…
Ну, я их реально изучал хотя бы. Не опираясь на мифы сообщества
Dmitriy
Умничка, 5 баллов.
Herman
Умничка, 5 баллов.
А сбертехе тоже вместо того, чтобы разбираться, верят в мифы?
Dmitriy
Ты мне больше неинтересен. Во флудилку можешь зайти и потоксить.
noi
Есть такая ошибка читать не полностью. Эта функция не вычисляет новое капасити, как бы не казалось Посмотри, где она вызывается и что происходит после нее Как референс на подумать. 17, как известно, меньше 256 https://go.dev/play/p/gdyQOtr4XAv
Я смотрел код после, вокруг и около, там шаманизм с поинтерами, могу допустить что где-то, в каких-то кейсах капасити по-другому работает. Вот гугловский коммит, тут четко написано как и почему, было бы странно если это не правда) https://go.googlesource.com/go/+/2dda92ff6f9f07eeb110ecbf0fc2d7a0ddd27f9d
Herman
Я смотрел код после, вокруг и около, там шаманизм с поинтерами, могу допустить что где-то, в каких-то кейсах капасити по-другому работает. Вот гугловский коммит, тут четко написано как и почему, было бы странно если это не правда) https://go.googlesource.com/go/+/2dda92ff6f9f07eeb110ecbf0fc2d7a0ddd27f9d
Нет, этот коммит не отвечает полностью на вопрос. Этот фактор роста это не коэффициент, на который умножается старый капасити и получается новый. Это всего лишь первое приближение к тому, что мы хотим итого А далее идёт много более важных вещей и конкретных вычислений
Herman
Не понял в чем смысл кода в плейграунде. Капасити умножается на 2, прибавляется сам элемент и +1 cap прозапас, это не противоречит тому, что писал я
В смысле про запас? Мне стало грустновато после этого сообщения Есть миф, что капасити умножается на два. В сбертехе особенно Показываю пример, где не умножается Говоришь - ну это про запас
noi
В смысле про запас? Мне стало грустновато после этого сообщения Есть миф, что капасити умножается на два. В сбертехе особенно Показываю пример, где не умножается Говоришь - ну это про запас
Так почему не умножается? 17*2 = 34, +элемент который мы добавили = 35, +1 по какой-то причине, тут не знаю. Это не противоречит формуле
Dmitriy
Herman, человек от вас ждет источник, а не пустые слова без подкрепления фактами.
Herman
Herman, человек от вас ждет источник, а не пустые слова без подкрепления фактами.
У человека не хватает базового понимания даже в рамках мифа
Dmitriy
Не разводите демагогию. Вас просят источник.
noi
Ну попробуй поменять на 16 и 18. Будет 32 и 36. Ровно на 2 умножается
Действительно, попробовал разные значения, увидел такую закономерноть, при четных числах ровно х2, при нечетных - х2+2
noi
Из чего можно сделать вывод что формула так или иначе используется, но присутствует какой-то доп модификатор
noi
тут рили сурсы надо смотреть, почему так
Максим
Максим
Максим
Максим
nextslicecap -> roundupsize -> shift
Alexey
Golang Jobs 🤔
noi
А вот и ответ
noi
Спасибо
Herman
Формула используется, но не не считает капасити, как многим кажется Доп модификатора нэма- у нас есть сайзклассы в байтах. Вот там коллега скинул скриншоты, есть этот раундап, который маппит размер нового капасити в сайзкласс Но суть, что оно не просто округляет капасити, а смотрит сколько байтов будет занимать итого слайс. Это значит, что в зависимости от типа будет разное количество Например слайс пустых структур всегда при аппенде +1 делает в капасити
Herman
Ну вообще про пустые структуры там отдельно прописано https://github.com/golang/go/blob/b9f245b8d3f851f04ad46d4dcc1928a0790c3383/src/runtime/slice.go#L174
noi
Не-а
Короче вот это всё равно не в тему было, всё как я и написал, но не стал вдавать в подробности(которые, признаю, не знал)
noi
Так что справедливо могу
noi
Не, там нету никакой прогрессивной формулы вычисления капасити. Это миф
Тебе скинули сурсы и гугловский коммит, где они описаны, ты троллишь?
Herman
Вот сайзклассы для коллег любящих источники (изучать не будут) https://github.com/golang/go/blob/8bba868de983dd7bf55fcd121495ba8d6e2734e7/src/runtime/sizeclasses.go#L1
Herman
Тебе скинули сурсы и гугловский коммит, где они описаны, ты троллишь?
Ладно, видимо я в пустоту все это описывал Религия сильнее
Herman
Это мы уже поняли, как у тебя в голове умещается "формула - миф" и "вот формула считает, НО еще и раундап есть"
Она не считает капасити, в том и суть Она считает сколько хотелось бы, а сколько реально будет считается на раундапе и зависит от типа
noi
Раундап как модификатор, зависящий от типа и memory layout, да. Но первично предполагаемый капасити вычисляется по формуле
Dmitriy
Вы вроде бы все обсудили уже…
noi
Поэтому надо заканчивать, да
Herman
Это просто демагогия и докапывание к словам
Реально? Ну типа у нас там в 10 шагов идёт вычисление, ты говоришь про первый «вот так считает». Все остальные шаги опускаются Если этот методологический подход считается правильным, то грустно А почему миф - это правда так и есть. Ничего не имеющая к реальным итоговым значениям формула, случайно кем-то найденная, выдана за абсолют. За нее готовы драться с пеной у рта, ведь как так, везде в интернете (кроме сорс кода) говорят «х2 до трешхолда и далее плавно до 1.25» А примеры, где правила не выполняются, отвергаются, и скидывается как мантра одна и та же ссылка, вот смотри тут oldcap + oldcap, а твои примеры это корнер кейсы ( спрашивается корнер кейсы чего - формула до банальности проста ) Если это не религия, то что ? Может, какой-то новый виток инженерной мысли А это ещё только слайс, далеко не единственная такая вещь