Борис
🐄 cowsay - это забавная и очень полезная (нет) библиотека, которая умеет выводить картинки различных животных, нарисованные символами 👌🏼 Чтобы увидеть этот шедевр самостоятельно, запускай код, который приведен ниже. Github @Golang_google
Шедевральный код: func printFigure(animal string) { if animal == "tux" { fmt.Println(" \\") fmt.Println(" \\") fmt.Println(" .--.") fmt.Println(" |o_o |") fmt.Println(" |:_/ |") fmt.Println(" // \\ \\") fmt.Println(" (| | )") fmt.Println(" /'\\_ _/`\\") fmt.Println(" \\___)=(___/") } else { fmt.Println(" \\ ^__^") fmt.Println(" \\ (oo)_______") fmt.Println(" (__)\\ )\\/\\") fmt.Println(" ||----w |") fmt.Println(" || ||") } }
Rostislav
на x64 он 64 бита, на x32 - 32
Rostislav
Я зануда. Я не смогла (себе) доказать, что конструкция if-else медленнее, чем вынос else-опции вперёд if. 1) Первый вариант (с классической конструкцией if-else) выполняется 1953954000 нс ~= 2 c 2) Второй вариант (с заменой else на присвоение перед if, в условии if - верный вариант) выполняется 3907236500 нс ~= 4 c 3) Третий вариант (с заменой else на присвоение перед if, в условии if - ложный вариант) выполняется 3945387700 нс ~= 4 c Но есть нюанс: наверное, я не корректно измеряю время (хотя вроде теми методами, даже двумя: Since() и Sub(), которыми положено) Сначала у меня все три способа были в одном файле, и иногда получался такой же результат, как написала, а иногда на всё уходило одинаковое время, 2с. Потом разделила на разные проекты, и по нескольку раз позапускала, результат выше. Как вообще корректно, кстати, время измерять? Первый (уходит 2 с): package main import ( "fmt" "time" ) func main() { var i int64 var N int64 = 1e9 a := 1 b := 2 var k int // 1 - zasekaem vremya na variant s else: k = 0 start1 := time.Now() for i = 0; i < N; i++ { if a < b { k += 1 } else { k -= 1 } } duration1 := time.Since(start1) end1 := time.Now() elapsed1 := end1.Sub(start1) fmt.Println(duration1.Nanoseconds(), elapsed1.Nanoseconds(), k) } Второй (уходит 4 с): package main import ( "fmt" "time" ) func main() { var i int64 var N int64 = 1e9 a := 1 b := 2 var k int // 2 - teper - bez else - vynosim lozhnyj variant vpered, a v if proveriaem tolko pravilnyj variant: k = 0 start2 := time.Now() for i = 0; i < N; i++ { k -= 1 if a < b { k += 1 } } duration2 := time.Since(start2) end2 := time.Now() elapsed2 := end2.Sub(start2) fmt.Println(duration2.Nanoseconds(), elapsed2.Nanoseconds(), k) } Третий (уходит 4 с): package main import ( "fmt" "time" ) func main() { var i int64 var N int64 = 1e9 a := 1 b := 2 var k int // 3 - teper - bez else - vynosim true variant vpered, a v if proveriaem tolko nepravilnyj variant: k = 0 start3 := time.Now() for i = 0; i < N; i++ { k += 1 if a > b { k -= 1 } } duration3 := time.Since(start3) end3 := time.Now() elapsed3 := end3.Sub(start3) fmt.Println(duration3.Nanoseconds(), elapsed3.Nanoseconds(), k) }
ну и как уже написал Илья. Есть бенчмарки для этого
Maria
смешно)
я почему-то думала, что int - это int8... надо поуточнять
Andrey
я почему-то думала, что int - это int8... надо поуточнять
и тебя не смущало, что ты пишешь int и присваиваешь числа больше чем 255?)
Maria
и тебя не смущало, что ты пишешь int и присваиваешь числа больше чем 255?)
да я уже позаменяла на int64 - искривление в мозгах
Maria
что интересно, в спецификации go вообще нет int
Maria
int8 the set of all signed 8-bit integers (-128 to 127) int16 the set of all signed 16-bit integers (-32768 to 32767) int32 the set of all signed 32-bit integers (-2147483648 to 2147483647) int64 the set of all signed 64-bit integers (-9223372036854775808 to 9223372036854775807)
Илья
да неужели
Maria
а нет)
Andrey
что интересно, в спецификации go вообще нет int
это логика про int и разрядность ОС распространяется на все ЯП
Maria
перерыв...
Alexander
что интересно, в спецификации go вообще нет int
потому что в зависимости от разрядности платформы выбирается нужный
Maria
uint either 32 or 64 bits int same size as uint
Maria
да, да, заскок
Maria
просто в древности были int и longint ... где-то там
Rostislav
там по-другому
Илья
Я зануда. Я не смогла (себе) доказать, что конструкция if-else медленнее, чем вынос else-опции вперёд if. 1) Первый вариант (с классической конструкцией if-else) выполняется 1953954000 нс ~= 2 c 2) Второй вариант (с заменой else на присвоение перед if, в условии if - верный вариант) выполняется 3907236500 нс ~= 4 c 3) Третий вариант (с заменой else на присвоение перед if, в условии if - ложный вариант) выполняется 3945387700 нс ~= 4 c Но есть нюанс: наверное, я не корректно измеряю время (хотя вроде теми методами, даже двумя: Since() и Sub(), которыми положено) Сначала у меня все три способа были в одном файле, и иногда получался такой же результат, как написала, а иногда на всё уходило одинаковое время, 2с. Потом разделила на разные проекты, и по нескольку раз позапускала, результат выше. Как вообще корректно, кстати, время измерять? Первый (уходит 2 с): package main import ( "fmt" "time" ) func main() { var i int64 var N int64 = 1e9 a := 1 b := 2 var k int // 1 - zasekaem vremya na variant s else: k = 0 start1 := time.Now() for i = 0; i < N; i++ { if a < b { k += 1 } else { k -= 1 } } duration1 := time.Since(start1) end1 := time.Now() elapsed1 := end1.Sub(start1) fmt.Println(duration1.Nanoseconds(), elapsed1.Nanoseconds(), k) } Второй (уходит 4 с): package main import ( "fmt" "time" ) func main() { var i int64 var N int64 = 1e9 a := 1 b := 2 var k int // 2 - teper - bez else - vynosim lozhnyj variant vpered, a v if proveriaem tolko pravilnyj variant: k = 0 start2 := time.Now() for i = 0; i < N; i++ { k -= 1 if a < b { k += 1 } } duration2 := time.Since(start2) end2 := time.Now() elapsed2 := end2.Sub(start2) fmt.Println(duration2.Nanoseconds(), elapsed2.Nanoseconds(), k) } Третий (уходит 4 с): package main import ( "fmt" "time" ) func main() { var i int64 var N int64 = 1e9 a := 1 b := 2 var k int // 3 - teper - bez else - vynosim true variant vpered, a v if proveriaem tolko nepravilnyj variant: k = 0 start3 := time.Now() for i = 0; i < N; i++ { k += 1 if a > b { k -= 1 } } duration3 := time.Since(start3) end3 := time.Now() elapsed3 := end3.Sub(start3) fmt.Println(duration3.Nanoseconds(), elapsed3.Nanoseconds(), k) }
https://go.dev/play/p/W-rGpp_odQj
Илья
с меньшим N
Илья
Aleksandr
Я зануда. Я не смогла (себе) доказать, что конструкция if-else медленнее, чем вынос else-опции вперёд if. 1) Первый вариант (с классической конструкцией if-else) выполняется 1953954000 нс ~= 2 c 2) Второй вариант (с заменой else на присвоение перед if, в условии if - верный вариант) выполняется 3907236500 нс ~= 4 c 3) Третий вариант (с заменой else на присвоение перед if, в условии if - ложный вариант) выполняется 3945387700 нс ~= 4 c Но есть нюанс: наверное, я не корректно измеряю время (хотя вроде теми методами, даже двумя: Since() и Sub(), которыми положено) Сначала у меня все три способа были в одном файле, и иногда получался такой же результат, как написала, а иногда на всё уходило одинаковое время, 2с. Потом разделила на разные проекты, и по нескольку раз позапускала, результат выше. Как вообще корректно, кстати, время измерять? Первый (уходит 2 с): package main import ( "fmt" "time" ) func main() { var i int64 var N int64 = 1e9 a := 1 b := 2 var k int // 1 - zasekaem vremya na variant s else: k = 0 start1 := time.Now() for i = 0; i < N; i++ { if a < b { k += 1 } else { k -= 1 } } duration1 := time.Since(start1) end1 := time.Now() elapsed1 := end1.Sub(start1) fmt.Println(duration1.Nanoseconds(), elapsed1.Nanoseconds(), k) } Второй (уходит 4 с): package main import ( "fmt" "time" ) func main() { var i int64 var N int64 = 1e9 a := 1 b := 2 var k int // 2 - teper - bez else - vynosim lozhnyj variant vpered, a v if proveriaem tolko pravilnyj variant: k = 0 start2 := time.Now() for i = 0; i < N; i++ { k -= 1 if a < b { k += 1 } } duration2 := time.Since(start2) end2 := time.Now() elapsed2 := end2.Sub(start2) fmt.Println(duration2.Nanoseconds(), elapsed2.Nanoseconds(), k) } Третий (уходит 4 с): package main import ( "fmt" "time" ) func main() { var i int64 var N int64 = 1e9 a := 1 b := 2 var k int // 3 - teper - bez else - vynosim true variant vpered, a v if proveriaem tolko nepravilnyj variant: k = 0 start3 := time.Now() for i = 0; i < N; i++ { k += 1 if a > b { k -= 1 } } duration3 := time.Since(start3) end3 := time.Now() elapsed3 := end3.Sub(start3) fmt.Println(duration3.Nanoseconds(), elapsed3.Nanoseconds(), k) }
мне ажется там логическая ошибка - сначала делается декремент потом если условие выполняется инкремент - что дает 0
Илья
компилятор может не добававлять сравнение потому что его можно вычислить в сompile-time
Илья
и вся идея со сравнением неуспешна из-за оптимизаций компилятора
Илья
по хорошему нужно на https://godbolt.org/ посмотреть
Maria
мне ажется там логическая ошибка - сначала делается декремент потом если условие выполняется инкремент - что дает 0
ну это просто я формально из else перенесла. Спасибо, пытаюсь смотреть про бенчмарки. а вывод пока такой у меня (это, конечно, всем интересно): без else в if имеет смысл заключать маловероятный случай, требующий больших вычислений...
Andrey
но как бы то не было, конструкция if-else может появится в коде, и от нее никак будет не избавится
Aleksandr
ну иногда можно на самом деле - заменить на умножение например
Илья
да, он вырезает
отметил стрелкой где должно быть сравнение
Илья
СMPQ это условние внутри for
Илья
т.е. компилятор даже не добавил if , что делает бенчи выше невалидными
anhckie
ребята, вопрос малость не по гоу, но про брокеры сообщений. читаю сейчас за rabbitmq. представим ситуацию, что паблишер отправил сообщение в реббит, оно попало в точку обмена (exchange). консьюмер должен будет прослушивать точку обмена с конкретным названием очереди, например, и даже может иметь ack директиву, для уведомления о том, что он внатуре прочитал и обработал, и можно удалять сообщение из точки обмена. а что если консьюмер не успел считать, сообщение, а реббит внезапно умер?
anhckie
есть ли какой-то механизм аварийного складирования сообщений на диск, чтобы при поднятии реббита он снова продолжил передавать сообщения?
anhckie
иль я шо-то не то написал вообще?)
anhckie
и вторая часть вопроса - слышал, что часто на собесах по брокерам спрашивают про exactly once. мол, кафка могёт, а реббит нет. так ли это и есть ли варианты решения этой задачи с использованием реббита?
anhckie
ага, на первый вопрос увидел инфу про durable state очереди и сообщений. второй ещё открыт )
ортем
как в Goland бороться с интерполяцией ломающей подсветку sql?
ортем
нашел - оказывается это вырубает только для конкретного стринга, а не глобально
Rostislav
и вторая часть вопроса - слышал, что часто на собесах по брокерам спрашивают про exactly once. мол, кафка могёт, а реббит нет. так ли это и есть ли варианты решения этой задачи с использованием реббита?
есть. Самому сделать exactly once семантику. Точно хз как ибо сам не делал. Но логика может быть такой: 1. Посылаешь в каждом сообщении id базу 2. У консьюмера айди сохраняется в базу например на 10 мин. 3. При получении нового сообщения проверяется, есть ли в базе этот айди. Есть есть, то игнорируем. Если нет, то обрабатываем. Ну и в самой очереди выставить at least once семантику (а не at most once)
anhckie
еще в вакансиях встречаю "понимание принципов построения высоконагруженных приложений". звучит как демагогия или есть конкретные принципы?
Rostislav
еще в вакансиях встречаю "понимание принципов построения высоконагруженных приложений". звучит как демагогия или есть конкретные принципы?
принципы есть, но написано мне кажется просто, чтобы сказать: нам нужен опытный человек. А иногда и просто так написано. всякие -ilities это. Scalability, reliability итд
Юра (Юрий Александрович)
Но как минимум слова "масштабируемость", "отказоустойчивость", "мониторинг", на мой взгляд, должны прозвучать.
Sergey
ребят, вопрос такой… у меня есть либа, которая требует handler в этом хендлере я делаю сет для значения… прблема в том что оно сетится в какой то другой реальности ) т.е. оно сетится и ftm.Prinln выводит знчение, но вот ftm.Prinln находящийся вне handler не выводит измененного значения что я делаю не так?
Grigory
передаешь переменную по значению
Sergey
в handler не передаю никаких значений
Sergey
просто беру локальную переменную и делаю сет
Sergey
если сет делается вне хендлрера все окей
Sergey
если внутри него то не окей
Sergey
с кодом сложно, там придется наверно весь проект кидать
Sergey
ковыряя кишки либы вижу что handler уходит в go
Sergey
это может как то влиять на контекст?
Sergey
если может то как это обойти?
Sergey
здесь передается handler
Sergey
здесь я вручную для теста делаю сет значения
Husniddin
Привет. можно ли использовать фильтр с ключами в Redis?
Sergey
это сам брокер
Sergey
т.е. я делаю ftxBroker.Price = 1000 (вне handler) и все окей…
Sergey
но внутри handler это уже работает как будто с копией ftxBroker
Sergey
в методе Connect в кишках либы вижу
Sergey
Sergey
у меня есдинственная мысль, что handler делает сет не в main и отсюда может быть (но это не точно)
Sergey
залез в кишки, делаю принудительный вызов hanlder здесь и все отлично работает
Sergey
делаю здесь и все не работает )
Sergey
есть идеи?
ортем
сорри за нубский вопрос, как это заменить в одну функцию? разница только в типе первого аргумента, оба имеют идентичное поле
Grigory
есть идеи?
пока похоже на то, что до вызова хендлера дело не доходит
Sergey
пока похоже на то, что до вызова хендлера дело не доходит
ну не, он то дергается, это я в Println вижу
Юра (Юрий Александрович)
пока похоже на то, что до вызова хендлера дело не доходит
можно дженерик-функцию использовать, а тип первого аргумента ограничить типами *cards.Card или *boosterpacks.BoosterPack, но я не уверен, что это хорошее решение будет.
Юра (Юрий Александрович)
все равно внутри придется делать свитч-кейс по типу залетевшего аргумента. Лучше оставьте, как есть
Grigory
ну не, он то дергается, это я в Println вижу
а если вывести адрес переменной, он тот же будет?