
Kirill
25.09.2016
20:01:16
в го можно писать код нормально, если есть чем думать

hamper ?
25.09.2016
20:01:28
хотя все от заказчиков зависит

Google

Roman
25.09.2016
20:01:40

Kirill
25.09.2016
20:02:08
я, например, недавно уперся в эффективность конкатенации, так как оптимизировал уже все остальное.

Vladimir
25.09.2016
20:02:25
В общем то разговор не очем, иногда нужно управлять памятью руками, как бы сложно это не было

Roman
25.09.2016
20:02:27

Vladimir
25.09.2016
20:03:29
В расте - ничего

Suika
25.09.2016
20:03:30
у меня были проблемы в яве из-за сборщика

Kirill
25.09.2016
20:04:10

Roman
25.09.2016
20:04:26
В расте - ничего
Вы так говорите, словно где-то нельзя аллоцировать память руками

Suika
25.09.2016
20:04:29
слишком резкие провалы в фпс в моменты сборки

Aleksei
25.09.2016
20:04:51

Vladimir
25.09.2016
20:04:55
> @pragus
Вы так говорите, словно где-то нельзя аллоцировать память руками
в го можно? может быть и так, но арифметики с указателями точно нет

Google

Kirill
25.09.2016
20:05:07

Suika
25.09.2016
20:05:19

Roman
25.09.2016
20:05:41

Vladimir
25.09.2016
20:05:55
Аллоцировать можно и в node.js

Aleksei
25.09.2016
20:05:55

Vladimir
25.09.2016
20:06:03
Только это будет просто буфер

Roman
25.09.2016
20:06:04

Kirill
25.09.2016
20:06:16

Suika
25.09.2016
20:06:18

Vladimir
25.09.2016
20:06:23
А чтобы туда положить структуру языка - это отдельная история

Roman
25.09.2016
20:06:26

Vladimir
25.09.2016
20:06:39
Смотря для чего
Только для io, в основном

Suika
25.09.2016
20:07:18
но там нельзя освободить память
можно лишь пометить для сборки

Vladimir
25.09.2016
20:07:53
> @olamedia
но там нельзя освободить память
можно вроде
в netty было что то такое
но может быть там просто возврат в свой пул

Roman
25.09.2016
20:08:44
пример?
https://m.habrahabr.ru/company/odnoklassniki/blog/139185/

Google

Suika
25.09.2016
20:08:46

Vladimir
25.09.2016
20:09:05
off heap, само собой

Roman
25.09.2016
20:09:11
Ну и что мешает из jni позвать malloc? :)

Vladimir
25.09.2016
20:10:20
Ну я хочу выделить память под структурированные данные
Не только же с сырыми буферами работать

Suika
25.09.2016
20:11:01

Vladimir
25.09.2016
20:11:05
Вот в сишке с этим все просто

Suika
25.09.2016
20:12:13

Vladimir
25.09.2016
20:12:46
мне кажется это не очень то приватные механизмы
а, нет
лол

Vladimir
25.09.2016
20:13:12
http://blog.dripstat.com/removal-of-sun-misc-unsafe-a-disaster-in-the-making/
хардкор
Netty
Cassandra
Hadoop
Kafka

Suika
25.09.2016
20:15:40
суть VM в JVM как раз в том что напрямую работа не ведется, и за выделение памяти в том числе отвечает виртуальная машина
можно, наверное, написать расширение или свою машину

Google

Suika
25.09.2016
20:17:32

Vladimir
25.09.2016
20:19:22
https://docs.google.com/document/d/1GDm_cAxYInmoHMor-AkStzWvwE9pw6tnz_CebJQxuUE/edit?pli=1#src
Весьма неплохо задокументировано, для каких кейсов нужен sun.misc.Unsafe
и как следствие, плох GC

hamper ?
25.09.2016
20:22:22

Kirill
25.09.2016
20:22:49
да, но тут через пул буферов
еще быстрее будет

Vladimir
25.09.2016
20:24:11
а в го нельзя создать строку из буфера без копирования?

Kirill
25.09.2016
20:24:52
можно, но мой вариант эффективнее, как ни странно

Admin
ERROR: S client not available

Vladimir
25.09.2016
20:25:10
Как это? Без копирования будет тоже самое минус копирование

Kirill
25.09.2016
20:25:34
если бы

Vladimir
25.09.2016
20:26:38
вот именно поэтому языки для системного программирования, это языки для системного программирования)
очевидно что конкатенацию строки можно сделать без выделения лишней памяти

Kirill
25.09.2016
20:28:12
а мой вариант оптимизируется так, что в 1.7 выделений лишней памяти нет

Vladimir
25.09.2016
20:28:45
Если не считать пул?
Который в общем то не нужен

Kirill
25.09.2016
20:29:05
а?!
как это не нужен?
строки иммутабельны, для результата всегда нужна какая-то память

Google

Vladimir
25.09.2016
20:29:53
зачем пул для конкатенации строк? Выделяешь память и копируешь туда данные

Kirill
25.09.2016
20:30:06
затем, чтобы память переиспользовать

hamper ?
25.09.2016
20:30:12
у твоего варианта один минус, в итоге он выдает строку а не буфер и учитывая что конкатенации делаются чаще всего в циклах то гонять туда сюда не рационально

Vladimir
25.09.2016
20:30:26
Ты эту строку наружу отдаешь, ее память ты все равно не сможешь преиспользовать
Ты переиспользуешь промежуточный буфер, который вообще не нужен

Kirill
25.09.2016
20:30:46
опять же, оптимизатор кладет в строку байты из буфера, а сам буфер очищается

Мерлин
25.09.2016
20:30:54

Vladimir
25.09.2016
20:31:12
Это не очень хитро)

Мерлин
25.09.2016
20:31:17
Так что функция возвращает всего лишь 16 байт максимум

hamper ?
25.09.2016
20:31:23
а чего хитрого? так почти везде

Vladimir
25.09.2016
20:31:48

Kirill
25.09.2016
20:31:56
а на что 16 байт? возврат идет указателя, а не всей структуры, так что от 4 до 8 байт

hamper ?
25.09.2016
20:32:12
собственно поэтому в го преобразования типа []byte(string) безопасны

Vladimir
25.09.2016
20:32:42
А наоборот?

Мерлин
25.09.2016
20:32:49

Kirill
25.09.2016
20:33:33
неявный

Vladimir
25.09.2016
20:34:33
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) // здесь выделяется память каждый раз и происходит копия
вот что я думаю
все так?