
Ievgenii
30.10.2017
13:05:23
А на счет 20К объектов в секунду - тоже такое себе...

Stepanos
30.10.2017
13:06:28
не понял вопроса :)
как бьі тьі сделал? :)

Google

Stepanos
30.10.2017
13:06:52
А на счет 20К объектов в секунду - тоже такое себе...
стандартньій подход же

Ievgenii
30.10.2017
13:09:48
Для меня объект созданный из класса - это что-то такое, что точно будет жить дольше чем 0.001-1 сек...

Stepanos
30.10.2017
13:11:02
в Java нет структур :)

Ievgenii
30.10.2017
13:11:11
Если нужно просто вычитать из БД и преобразовать полученный вариант в JSON - так это прям штамп сверху: Структура!

Stepanos
30.10.2017
13:11:55
ужс) я не о том тебе говорю

Ievgenii
30.10.2017
13:12:04
Хорошо
Давай тогда скажу, как бы я без структур делал
В таком случае, я бы сделал пул объектов
И использовал бы этот шаблон
И дал бы он просто колосальный выхлоп

Google

Ievgenii
30.10.2017
13:13:00
В этом случае
Т.к. ты бы не удалял и не создавал объекты
А создал бы разово и держал бы их
Вот и все
СМ отдыхал бы и не вмешивался
Более того, для этого функционала его можно было бы даже отрубить!
Чтобы он даже не следил за этой памятью
Т.к. ты бы сам управлял этими объектами
Вот тебе и работа с объектами класса, и инкапсуляция, и твои любимые 20 объектов на каждый запрос
Так тебе сойдет?
И снова это нас подводит к тому, что не СМ плохой, а то, как пишет разработчик! Нужно заранее проектировать и понимать, что ты делаешь высоконагруженный проект

Stepanos
30.10.2017
13:16:54
:) сойдет

Ievgenii
30.10.2017
13:16:55
А значит и подходы должны быть отличными от того, чтобы для каждого запроса создавать свои 20 объектов, чтобы перегнать их в JSON и заставлять СМ следить за ними и удалять сразу, как только тебе понадобился новый кусок памяти
И создал бы таймер, который запускался бы раз в 5-10 минут и удалял ОЧЕНЬ старые объекты
Сейчас нарвусь на то, что это костыль
Что это ручной СМ...
И всякое такое

Andrey
30.10.2017
13:19:00

Ievgenii
30.10.2017
13:19:07
Но это HL, а значит подходы должны меняться! Влоть до того, чтобы работать без объектов

Pavel
30.10.2017
14:14:48

Google

Pavel
30.10.2017
14:15:08
Если он медленнее них, значит он плохой, без вариантов =)

Ievgenii
30.10.2017
14:15:26
Согласен, тогда он будет хуже
НО!
Если ты реально напишешь тест 1 в 1
Тогда поверю
А не так - Ну тут для GO подругому не сделаешь, так что я решил сделать так
1 в 1
Иначе тест не имеет смысла

Pavel
30.10.2017
14:16:14
Ну конечно реализации должны быть сопоставимы

Dmitry
30.10.2017
14:45:04
Если сравнивать чисто GC, то результат довольно предсказуем (Дишный прососет). Ибо там сам подход разный: в языках с инкрементальными и generational GC пожертвовали скоростью основного кода, зато обеспечили короткие паузы на сборку мусора. В Ди наоборот - основной код работает быстро как в Си, без издержек на write barriers, но за это платят медленным GC. Поэтому нужно с умом подходить к тому, в каких задачах и как лучше применять Ди, и поэтому стоит сравнивать итоговую производительность идиоматичного кода, а не одинаковый код на разных языках. Что хорошо работает в Жяве плохо годится для Ди.

Pavel
30.10.2017
14:48:22
Наверно идеально было бы если бы можно было выбирать между разными имплементациями GC - либо он по чуть чуть подчищает, либо долго ждет и сразу помногу

Ievgenii
30.10.2017
14:51:46

Pavel
30.10.2017
14:52:16
Под разные задачи - иногда важно подчищать по чуть чуть, а иногда надо отработать очень быстро и потом много почистить

Dmitry
30.10.2017
14:52:46
Инкрементальная сборка обычно требует изменений в кодогенераторе, чтоб каждая запись в указатель обкладывалась барьерами. Это такие нехилые изменения в компилятор надо ввести, и перекомпилять весь код при смене сборщика.

Pavel
30.10.2017
14:53:35
А если просто почаще вызывать GC.collect() это будет не то же по эффективности?

Dmitry
30.10.2017
14:54:14
Нет, он будет всю кучу обходить, вместо того чтобы один кусочек.
Весь цимес инкрементальной и generational сборки в том, что при очередном цикле сборки обходим лишь небольшой кусок кучи. Но для этого надо быть уверенным, что если основной код что-то поменяет в уже пройденном сборщиком куске, то сборщик об этом узнает.

Pavel
30.10.2017
14:57:03
А в go я так понимаю как раз инкрементальная сборка?

Andrey
30.10.2017
14:57:11
я у себя пробовал вызывать GC.collect() каждый кадр. Занимало по 5-7 мс

Pavel
30.10.2017
14:57:12
А в джаве какая?

Google

Dmitry
30.10.2017
14:58:00
В Go и Java инкрементальная и параллельная, да (в джаве еще выбор есть из нескольких алгоритмов).

qwerty
30.10.2017
14:58:12
а у нас не инкрементальная? о_О

Pavel
30.10.2017
14:58:29
Нет, полноценная

Dmitry
30.10.2017
14:58:40
Last time I checked в D сборщик каждый раз все обходил. Потому и тормозит.

qwerty
30.10.2017
14:59:37
Блин, надо короче разобраться в DMD уже и контрибъютить(

Dmitry
30.10.2017
15:00:01
Так сообщество не пойдет на внесение write barriers
Ибо сразу будет потеряно свойство "быстро как в Си"

Pavel
30.10.2017
15:00:42
Если честно то это и хорошо как по мне =) Не нужно всяких мусор в код вставлять
Тогда в случае невысоких нагрузок в D все хорошо, а в случае высоких распадаемся еще на два варианта - высокие пульсирующие, и высокие постоянные. В первом случае можно подчищать память в перерывах между нагрузкой, а во втором придется отказаться от встроенного GC или написать свой какой-то.

qwerty
30.10.2017
15:07:17

Admin
ERROR: S client not available

qwerty
30.10.2017
15:07:25
во втором варианте?

Dmitry
30.10.2017
15:07:40
Для веб-сервисов хорошо использовать allocator building blocks, так чтобы каждый обработчик запроса использовал свой кусочек памяти, который после завершения запроса моментально объявляется свободным. Так и аллокация дешевая, и расходы на сборку нулевые по сути. Технически с std.experimental.allocator это делается, но нужна дисциплина при написании кода.

Pavel
30.10.2017
15:07:50
Можно, но пользоваться фобосом тогда сложно, а он много где требуется.

qwerty
30.10.2017
15:09:14
GC - часть фобоса или компилятора?

Dmitry
30.10.2017
15:09:40
формально - часть рантайма. Но компилятор опирается на его API

qwerty
30.10.2017
15:10:34
то есть чтоб встроить гипотетический GC надо форкнуть фобос?

Pavel
30.10.2017
15:11:23
Я так подозреваю что там все подряд придется форкнуть

Dmitry
30.10.2017
15:11:31
там предусмотрена возможность включения своего GC, если он по API совместим. Даже ничего заменять и пересобирать не надо.

qwerty
30.10.2017
15:11:45
интересно

Google

Dmitry
30.10.2017
15:12:03
Но если хочется фич инкрементальности, то это надо весь компилятор форкать
По крайней мере раньше работала установка proxy: https://github.com/dlang/druntime/blob/master/src/gc/proxy.d Я так делал анализ статистики и замену дефолтного аллокатора на арену.
Теперь еще есть какой-то выбор варианта GC через конфиг, прямо в рантайме. https://github.com/dlang/druntime/blob/master/src/gc/config.d

Pavel
30.10.2017
15:32:43
string gc = "conservative"; // select gc implementation conservative|manual

Ievgenii
30.10.2017
15:55:16
Кто использует Вайб?
Если разобраться, что именно вы используете от фреймворка?
Это не тролинг
Интересно

Dmitry
30.10.2017
16:02:39
В паре проектов - простой раутинг и отдача бинарных данных и простого html (без шаблонов diet). Еще в одном проекте использую WebSocket клиент из вайба внутри десктопного приложения. Для этого в отдельном потоке крутится эвентлуп вайба. Несколько лет назад еще делал простенький веб-проектик, там были diet шаблоны и авторизация.

Oleg
30.10.2017
16:09:30

Ievgenii
30.10.2017
16:48:40
Ясно

Dmitry
30.10.2017
17:23:43
Базы данных его конекшен пул вроде еще умеют юзать
Вопрос. А кто что использует для создания схем миграций БД. Как я понимаю эта штука нужна чтобы неудачные изменения можно было откатить

Pavel
30.10.2017
17:29:47
схема миграции - нет такого понятия
Есть миграция, а есть схема БД

Stepanos
30.10.2017
17:29:58
http://www.liquibase.org/

Pavel
30.10.2017
17:30:06
В крайнем случае есть миграция схемы

Ievgenii
30.10.2017
17:32:28
Чтобы можно было запустить и с 0 развернуть работающую БД
Очень полезная штука

Dmitry
30.10.2017
17:39:09
А их руками пишут и через орм? Я правильно понимаю они нужны чтобы изменения откатывать/применять

Pavel
30.10.2017
17:39:29
Да