@nodejs_ru

Страница 232 из 2748
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
В общем то разговор не очем, иногда нужно управлять памятью руками, как бы сложно это не было

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
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
в яве?
в мотоцикле? [1]

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
https://m.habrahabr.ru/company/odnoklassniki/blog/139185/
"У пытливого читателя может возникнуть вопрос: не стесняемся ли мы использовать приватные механизмы HotSpot (sun.misc.Unsafe) для нашего функционала"

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
(решение тут: https://github.com/kirillDanshin/myutils/blob/master/strings.go#L6)
так конкатенация через буферы это нормальная практика в го же, там где нужна быстрая конкатенация никто никогда не пишет кода вида a = a + b

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
зачем пул для конкатенации строк? Выделяешь память и копируешь туда данные
Пул буфферов - это по сути пул переиспользуемой памяти А строки в го устроены хитро Стркоа - это int и указатель на массив

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
Так что функция возвращает всего лишь 16 байт максимум
Проблема в том что происходит сборка строки в буфере, а потом еще копируется в строку

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
А наоборот?

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) // здесь выделяется память каждый раз и происходит копия

вот что я думаю

все так?

Страница 232 из 2748