Roman
Только это будет просто буфер
И? Этого обычно достаточно.
Vladimir
Смотря для чего
Vladimir
Только для io, в основном
W.Ed.
И? Этого обычно достаточно.
я в общем-то с буферами и работал
W.Ed.
но там нельзя освободить память
W.Ed.
можно лишь пометить для сборки
Vladimir
> @olamedia но там нельзя освободить память можно вроде
Vladimir
в netty было что то такое
Vladimir
но может быть там просто возврат в свой пул
Roman
пример?
https://m.habrahabr.ru/company/odnoklassniki/blog/139185/
Vladimir
off heap, само собой
Roman
Ну и что мешает из jni позвать malloc? :)
Vladimir
Ну я хочу выделить память под структурированные данные
Vladimir
Не только же с сырыми буферами работать
Vladimir
Вот в сишке с этим все просто
W.Ed.
https://m.habrahabr.ru/company/odnoklassniki/blog/139185/
"У пытливого читателя может возникнуть вопрос: не стесняемся ли мы использовать приватные механизмы HotSpot (sun.misc.Unsafe) для нашего функционала"
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.
можно, наверное, написать расширение или свою машину
Vladimir
https://docs.google.com/document/d/1GDm_cAxYInmoHMor-AkStzWvwE9pw6tnz_CebJQxuUE/edit?pli=1#src
Vladimir
Весьма неплохо задокументировано, для каких кейсов нужен sun.misc.Unsafe
Vladimir
и как следствие, плох GC
hamper 𓅝
(решение тут: https://github.com/kirillDanshin/myutils/blob/master/strings.go#L6)
так конкатенация через буферы это нормальная практика в го же, там где нужна быстрая конкатенация никто никогда не пишет кода вида a = a + b
Kirill
да, но тут через пул буферов
Kirill
еще быстрее будет
Vladimir
а в го нельзя создать строку из буфера без копирования?
Kirill
можно, но мой вариант эффективнее, как ни странно
Vladimir
Как это? Без копирования будет тоже самое минус копирование
Kirill
если бы
Vladimir
вот именно поэтому языки для системного программирования, это языки для системного программирования)
Vladimir
очевидно что конкатенацию строки можно сделать без выделения лишней памяти
Kirill
а мой вариант оптимизируется так, что в 1.7 выделений лишней памяти нет
Vladimir
Если не считать пул?
Vladimir
Который в общем то не нужен
Kirill
а?!
Kirill
как это не нужен?
Kirill
строки иммутабельны, для результата всегда нужна какая-то память
Vladimir
зачем пул для конкатенации строк? Выделяешь память и копируешь туда данные
Kirill
затем, чтобы память переиспользовать
hamper 𓅝
у твоего варианта один минус, в итоге он выдает строку а не буфер и учитывая что конкатенации делаются чаще всего в циклах то гонять туда сюда не рационально
Vladimir
Ты эту строку наружу отдаешь, ее память ты все равно не сможешь преиспользовать
Vladimir
Ты переиспользуешь промежуточный буфер, который вообще не нужен
Kirill
опять же, оптимизатор кладет в строку байты из буфера, а сам буфер очищается
Мерль
зачем пул для конкатенации строк? Выделяешь память и копируешь туда данные
Пул буфферов - это по сути пул переиспользуемой памяти А строки в го устроены хитро Стркоа - это int и указатель на массив
Vladimir
Это не очень хитро)
Мерль
Так что функция возвращает всего лишь 16 байт максимум
hamper 𓅝
а чего хитрого? так почти везде
Vladimir
Так что функция возвращает всего лишь 16 байт максимум
Проблема в том что происходит сборка строки в буфере, а потом еще копируется в строку
Kirill
а на что 16 байт? возврат идет указателя, а не всей структуры, так что от 4 до 8 байт
hamper 𓅝
собственно поэтому в го преобразования типа []byte(string) безопасны
Vladimir
А наоборот?
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
Что не так?
Anonymous
давайте сразу про хаскель
Anonymous
чего тянуть
Vladimir
Попозже