Roman
Vladimir
Смотря для чего
Vladimir
Только для io, в основном
W.Ed.
но там нельзя освободить память
W.Ed.
можно лишь пометить для сборки
Vladimir
> @olamedia
но там нельзя освободить память
можно вроде
Vladimir
в netty было что то такое
Vladimir
но может быть там просто возврат в свой пул
Roman
пример?
https://m.habrahabr.ru/company/odnoklassniki/blog/139185/
W.Ed.
Vladimir
off heap, само собой
Roman
Ну и что мешает из jni позвать malloc? :)
Roman
Vladimir
Ну я хочу выделить память под структурированные данные
Vladimir
Не только же с сырыми буферами работать
W.Ed.
Vladimir
Вот в сишке с этим все просто
Dmitry
Vladimir
мне кажется это не очень то приватные механизмы
Vladimir
а, нет
Vladimir
лол
Vladimir
http://blog.dripstat.com/removal-of-sun-misc-unsafe-a-disaster-in-the-making/
Vladimir
хардкор
Vladimir
Netty
Vladimir
Cassandra
Vladimir
Hadoop
Vladimir
Kafka
W.Ed.
суть VM в JVM как раз в том что напрямую работа не ведется, и за выделение памяти в том числе отвечает виртуальная машина
W.Ed.
можно, наверное, написать расширение или свою машину
W.Ed.
Vladimir
https://docs.google.com/document/d/1GDm_cAxYInmoHMor-AkStzWvwE9pw6tnz_CebJQxuUE/edit?pli=1#src
Vladimir
Весьма неплохо задокументировано, для каких кейсов нужен sun.misc.Unsafe
Vladimir
и как следствие, плох GC
Kirill
да, но тут через пул буферов
Kirill
еще быстрее будет
Vladimir
а в го нельзя создать строку из буфера без копирования?
Kirill
можно, но мой вариант эффективнее, как ни странно
Vladimir
Как это? Без копирования будет тоже самое минус копирование
Kirill
если бы
Vladimir
вот именно поэтому языки для системного программирования, это языки для системного программирования)
Vladimir
очевидно что конкатенацию строки можно сделать без выделения лишней памяти
Kirill
а мой вариант оптимизируется так, что в 1.7 выделений лишней памяти нет
Vladimir
Если не считать пул?
Vladimir
Который в общем то не нужен
Kirill
а?!
Kirill
как это не нужен?
Kirill
строки иммутабельны, для результата всегда нужна какая-то память
Vladimir
зачем пул для конкатенации строк? Выделяешь память и копируешь туда данные
Kirill
затем, чтобы память переиспользовать
hamper 𓅝
у твоего варианта один минус, в итоге он выдает строку а не буфер и учитывая что конкатенации делаются чаще всего в циклах то гонять туда сюда не рационально
Vladimir
Ты эту строку наружу отдаешь, ее память ты все равно не сможешь преиспользовать
Vladimir
Ты переиспользуешь промежуточный буфер, который вообще не нужен
Kirill
опять же, оптимизатор кладет в строку байты из буфера, а сам буфер очищается
Vladimir
Это не очень хитро)
Мерль
Так что функция возвращает всего лишь 16 байт максимум
hamper 𓅝
а чего хитрого? так почти везде
Kirill
а на что 16 байт? возврат идет указателя, а не всей структуры, так что от 4 до 8 байт
hamper 𓅝
собственно поэтому в го преобразования типа []byte(string) безопасны
Vladimir
А наоборот?
Мерль
Kirill
неявный
Kirill
Kirill
Vladimir
func Concat(a string, b ...string) string {
if len(b) == 0 {
return a
}
buf := bytebufferpool.Get()
defer bytebufferpool.Put(buf)
buf.SetString(a)
for _, s := range b {
buf.WriteString(s) // здесь может выделяться память несколько раз
}
return string(buf.B) // здесь выделяется память каждый раз и происходит копия
Vladimir
вот что я думаю
Vladimir
все так?
Мерль
Vladimir
В сишке ты бы один раз выделил память
Vladimir
Что не так?
Kirill
Anonymous
давайте сразу про хаскель
Anonymous
чего тянуть
Vladimir
Попозже
Kirill