Artem
а вот это типо быстрее работает, чем обычный каст? func efaceToInt(eface interface{}) int { return (*(*int)((*[2]unsafe.Pointer)(unsafe.Pointer(&eface))[1])) }
Daniel
да вот чет не особо
🏁Александр
а в бенче первая цифра это количество итераций которые он "успел"?
🏁Александр
что-то слишком уж круглое число
Artem
у меня получилось 3846 ns/op vs 3626 ns/op
так наверное пора подвезти оптимизацию в компилятор, если быстрее
Daniel
как мы видим - оптимизацию надо в структуры данных подвозить, а не в компилятор
🏁Александр
BenchmarkRemote0-4 200000 5566 ns/op BenchmarkNewList-4 300000 5851 ns/op BenchmarkRemote0Opt-4 200000 5704 ns/op BenchmarkNewListOpt-4 300000 5440 ns/op BenchmarkNewSlice-4 300000 4752 ns/op
🏁Александр
мои результаты
🏁Александр
это версия от @madgopher
L
мои результаты
запусти еще раз, что-то странно О___О
🏁Александр
а шо не так?
L
BenchmarkRemote0Opt-4 медленнее, чем BenchmarkRemote0-4
Daniel
так и есть
Kirill
версия какая?)
Kirill
golang
🏁Александр
твоя
Алексей
.dll, .so они основа всех систем и приложений, ты сейчас ими пользушься пока пишешь)
Это всё сишный интерфейс, то есть все функции - как старые добрые сишные с extern "C" с указателями и без всех крестовых возможностей. То есть никаких шаблонов к примеру. Хотя вроде Qt крестовые функции из dll экспортирует, но это не всегда возможно.
🏁Александр
а тфу
Kirill
твоя
нет у тебя моей :D
🏁Александр
я думал ты про версию бенча
🏁Александр
go version go1.11 darwin/amd64
Kirill
а, логично тогда
L
так и есть
а вот и нет. 3 раза проверял. с точностью до наоборот все go version go1.11 darwin/amd64 mac os x BenchmarkRemote0 3807 ns/op BenchmarkRemote0Opt 3539 ns/op
Kirill
а, логично тогда
@ruelephant https://github.com/golang/go/issues/27180
🏁Александр
а мне то зачем это отдал?
🏁Александр
у меня была версия с (int)
Kirill
у меня была версия с (int)
у меня .(int) медленнее работает :D
🏁Александр
Kirill
у меня .(int) медленнее работает :D
и на кластере у нас тоже
L
Что серьезно за разрыв в 300-500 наносекунд спор идет?? :)
представь сколько такая оптимизация для всех, в рамках планеты сэкономит электричества!
🏁Александр
Kirill
представь сколько такая оптимизация для всех, в рамках планеты сэкономит электричества!
или когда несколько сотен миллиардов итераций нужно сделать
🏁Александр
я думаю потому что у меня процессор не последнего поколения
🏁Александр
и память DDR3 1600
YᑌᖇIY
представь сколько такая оптимизация для всех, в рамках планеты сэкономит электричества!
Представь ситуацию... в мире работет и производится (на замену ежегодно) порядка семи миллиардов штук электро-двигателей различной мощности и исполнений. Уменьшение потребления на 20-30% (с увеличением мощности), дает экономию гигаваты электричества (миллиаров рублей или долларов)
Алексей
написать .dll то можно и в C++ 🙂
Но интерфейс у неё будет чисто сишный. А его ещё и сделать надо, он автоматически не делается. Либо делать крестовый интерфейс, но тогда применение этих dll сильно ограничивается. То есть даже с другой версии крестового компилятора могут возникнуть проблемы.
Daniel
BenchmarkRemote0-4 200000 5566 ns/op BenchmarkNewList-4 300000 5851 ns/op BenchmarkRemote0Opt-4 200000 5704 ns/op BenchmarkNewListOpt-4 300000 5440 ns/op BenchmarkNewSlice-4 300000 4752 ns/op
BenchmarkRemote0 300000 4284 ns/op BenchmarkNewList 500000 3951 ns/op BenchmarkRemote0Opt 500000 3948 ns/op BenchmarkNewListOpt 300000 4018 ns/op BenchmarkNewSlice 1000000 1589 ns/op
Daniel
вы, я надеюсь, не забываете GOMAXPROCS=1 ставить?
Artem
нужен гайд, как делать тру бенчи
Kirill
Срань божья.
ну — рассказывай. 🙃
.
Кстати на счёт иммутабельности, вместо того чтобы вводить ключевое слово, почему бы не ввести ее в виде иммутабельных типов? Например i_int8/int8i
Anonymous
Кстати на счёт иммутабельности, вместо того чтобы вводить ключевое слово, почему бы не ввести ее в виде иммутабельных типов? Например i_int8/int8i
Типов может быть много, а если есть возможность типу просто дать свойство неизменяемости - то это универсально
Alexander
имхо, ключевое слово читабельнее и универсальнее
саша
Иммутабельность — свойство конкретного биндинга
Daniel
Биндинга?
Roman
Кстати на счёт иммутабельности, вместо того чтобы вводить ключевое слово, почему бы не ввести ее в виде иммутабельных типов? Например i_int8/int8i
1. в пропосале не описывается введение нового ключевого слова а перегрузка ключевого слова const: 4.4 Why overload the const keyword instead of introducing a new keyword like immutable etc.? https://github.com/romshark/Go-2-Proposal---Immutability#44-why-overload-the-const-keyword-instead-of-introducing-a-new-keyword-like-immutable-etc 2. потому-что тогда тебе придётся свои типы вручную писать в двух вариантах, мутабельный и немутабельный. Это можно делать уже сейчас, например оборачивать все типы интерфейсами и работать только через интерфейсы. Где-то использовать мутабельный интерфейс (с Write методами) а где-то немутабельный (только Read методы)). Но сколько же это boilerplate кода...
саша
Биндинга?
Связывания имени с данными.
Je
Связывания имени с данными.
А как же передача по указателю? Всегда по имени передавать, чекать и боксить к типу его некий meta?
саша
Ну вообще не обязательно
Остальное контринтуитивно.
Алексей
Roman
Иммутабельного типа быть не может.
может)) весь пропосал про иммутабельные типы если внимательно почитать)
Алексей
Достаточно взглянуть на тот же питон.
Je
const указатели это совсем другое.
Если я правильно понял, ты предлагаешь по имени проверять доступ к данным, тогда ты должен либо 1) запретить передачу по указателю 2) boxing мета-инфы типа вместе с ним (python way?)
Roman
а когда тонны boilerplate кода пугали евангелистов го? мне казалось, что у них фетиш на этом
тонны окей, но не мегатонны же? каждый долбанный тип в интерфейс оборачивать убьёт производительность, скорость написания и вообще всё всё всё
саша
Вот смотрите, в JS есть иммутабельные биндинги - const, а вот const указателей нет и по этому гарантии const в JS ничего не стоят, ибо почти все данные ссылочные.
Andrei 🦉
тонны окей, но не мегатонны же? каждый долбанный тип в интерфейс оборачивать убьёт производительность, скорость написания и вообще всё всё всё
все всегда можно решить кодогенерацией, будет вам ответ я это написал к тому, что написание тонн одинакового кода не считается чем то плохим в го сообществе
Roman
const указатели это совсем другое.
указатель это тип. *T иммутабельный указатель это тоже тип. const *T указатель на иммутабельный объект это тоже тип. * const T и иммутабельный указатель на иммутабельный тип - тоже тип. const * const T 2.9.1. Pointer Examples https://github.com/romshark/Go-2-Proposal---Immutability#291-pointer-examples
V
привет c++
V
только там const *T - это указатель на иммутабельный тип
V
вроде
Roman
Вот смотрите, в JS есть иммутабельные биндинги - const, а вот const указателей нет и по этому гарантии const в JS ничего не стоят, ибо почти все данные ссылочные.
нет в JS иммутабельности, там только shallow immutability, я её называю fake & useless immutability. можно изменить поле const объекта и рантайм даже не пикнет 😀 а freeze это не решение, ибо, опять-же, shallow... deepfreeze сильно бьёт по производительности
Roman
все всегда можно решить кодогенерацией, будет вам ответ я это написал к тому, что написание тонн одинакового кода не считается чем то плохим в го сообществе
ага, кодогенерации нам ещё не хватало)) всё она может решить, кроме пониженой runtime производительности ибо интерфейсы не бесплатные, как впрочем и копирование ну и конечно-же проблема explicit кодо-генерации кодогенерация, очевидно, не решает