@dlangru

Страница 305 из 719
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
@asan13 перечитай еще раз все :) где я писал о миллионе? есть 1000 паралельньіх запросов, где я ЗА ОДИН РАЗ КАЖДОМУ ПОЛЬЗОВАТЕЛЮ ОТПРАВЛЯЮ ТОЛЬКО 20 записей (пагинация, я писал), 1000 пользователей * 20 = 20к обьектов в секунду
я не про твой случай, выше увидел про миллион объектов из БД :) касательно 1000 клинтов по 20 записей - и что, реально GC ощутимо фризит, этло реальный сервис?

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

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 - либо он по чуть чуть подчищает, либо долго ждет и сразу помногу

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 или написать свой какой-то.

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
vibe.data.json
и только из-за сериализации

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
Да

Страница 305 из 719