|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
По крайней мере если нам надо что то такое страшное со строками творить, будем знать, что все заканчивается после выхода из процедуры и дальше за собой мусор в куче не тянет. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2018, 00:39 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Извините за кучу сообщений, постоянно идеи приходят в голову. Семантика tmp-объектов на стеке - их нельзя возвращать и никогда нельзя ничему присваивать. Расширять на все классы не предлагаю - сложно и ни к чему. Достаточно TmpStringBuilder и может какого-нибудь TmpByteArray - конкретных классов, от которых нельзя наследовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2018, 00:46 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Eugene NewНовый класс TmpStringBuilder - с выделением всегда на стеке. Что имеете против такой идеи? Я не против. Делай. Только пара замечаний. 1) JVM изначально - стековая машина. И любая операция даже будь то сложение регистров int32 проходит через пушинг в стек. 2) Что будешь делать если в процессе работы с TmpStringBuilder тебе надо сделать еще один вызов метода? Опиши состояние стека до и после. 3) Не надо никакой новый класс делать. То что ты делаешь это изменение спецификации JVM ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2018, 00:49 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Eugene NewПочитал про указатели в Rust. Понял с первого раз одно - намудрили они изрядно. Ну ты и быстр. УЖе прочитал? Дай ссылку и мне. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2018, 00:51 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Eugene NewПо крайней мере если нам надо что то такое страшное со строками творить, будем знать, что все заканчивается после выхода из процедуры и дальше за собой мусор в куче не тянет. Давай еще подкину пищу для размышлений. Современный код который занят инициализацией должен шарить результат своей работы. Твой волшебный билдер который волшебным образом удаляет сам себя со стека непонятно какую проблему решает. Его результат - тоесть копирование в строку всё равно должен быть сохранен. Его нельзя убивать сворачиванеим стека. Если ты считаешь что оптимизировав удаление билдера ты вдруг очень круто помог GC - то я думаю что здесь ты ошибаешся количественно. От тебя нужен strong justification. Не просто сказать "я так решил" или "я так думаю". А провести исследования. Собрать макет. Прогнать его на типовых задачах. В конце должен быть JEP. Давай. Побей Шипилёва. Go-Go. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2018, 01:02 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
mayton, JVM изначально - стековая машина. И любая операция даже будь то сложение регистров int32 проходит через пушинг в стек. 2) Что будешь делать если в процессе работы с TmpStringBuilder тебе надо сделать еще один вызов метода? Опиши состояние стека до и после. Навскидку два варианта (о них уже упоминал): 1. Второй стек. независимый от настоящего. Когда создаем TmpObject - перемещаем указатель вперед и запоминаем, сколько должны вернуть. При выходе из функции сдвигаем указатель на вершину "стека" назад. Настоящий стек это вообще никак не затрагивает. 2. Сделать вместимость TmpObject константой и привязать к объявлению функции. Код: sql 1. 2. 3. 4.
Тогда по сути это не будет ничем отличаться от выделения памяти под параметры. Выделяется при вызове функции, при выходе освобождается. УЖе прочитал? Дай ссылку и мне. https://www.ibm.com/developerworks/ru/library/l-rust_08/index.html ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2018, 01:07 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Eugene New1. Второй стек. независимый от настоящего. Когда создаем TmpObject - перемещаем указатель вперед и запоминаем, сколько должны вернуть. При выходе из функции сдвигаем указатель на вершину "стека" назад. Настоящий стек это вообще никак не затрагивает. Стоп-стоп. Подожди. Современный сервернй Java-процесс поднимает до нексольких тысяч Threads. Каждый Thread будет аллоцировать помимо основного стека еще и твой второй стек. Сколько-же тебе памяти надо? Какова вероятность что потокам понадобится второй стек? Беря во внимание частоту использования билдера - вангую что почти всем. Но я думаю что уже на этом шаге можно забить капитальный гвоздь. Твоя доработка может переполнить свободную память. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2018, 01:12 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
mayton, Код: java 1.
Если нам надо что то вернуть, а не просто использовать - результат будет сохранен обычным образом - через функцию TmpStringBuilder.toString(). Которая выделить память в обычной куче под неизменяемый String. На чем экономим? На том, что сам TmpStringBuilder удалится. Сейчас когда мы используем StringBuilder, он остается в виде мусора и ждет сборщика мусора. А TmpStringBuilder уберется сразу. И мы будем хранить только готовые неизменяемые строки. Разрешаем TmpStringBuilder передавать по ссылке вниз вызываемым функциям, чтобы в него там можно было что то писать и не требовалось возвращать String для промежуточных результатов. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2018, 01:14 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Eugene New Код: sql 1. 2. 3. 4.
Здесь вообще ничего не понимаю. Откуда взялось число 1000 ? Откуда 123? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2018, 01:14 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
mayton, Какова вероятность что потокам понадобится второй стек? Второй "стек" не обязательно вызывать на каждый поток. Простейший способ - при создании потока определять, нужен ли ему второй стек. Если поток создан, как поток без второго стека, вызывать Exception времени выполнения при вызове функций с TmpObject-ми. Не забывай про вариант #2, без второго стека. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2018, 01:21 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
mayton, Откуда взялось число 1000 ? Откуда 123? Константа - размер в символах. Вроде Код: sql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2018, 01:23 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Подобно тому, как в С++ объявляются статические локальные массивы. Код: sql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2018, 01:24 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Eugene NewПростейший способ - при создании потока определять, нужен ли ему второй стек. Если поток создан, как поток без второго стека, вызывать Exception времени выполнения при вызове функций с TmpObject-ми. Капец какой-то! Это кто будет решать нужен ему поток или нет? Программист? А зачем еще один Exception? Чтобы программисты заплакали горькими слезами и бежали еще дальше от таких улучшений? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2018, 01:26 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
То есть в варианте два Capacity мы задаем сразу и изменять его не сможем. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2018, 01:26 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
mayton, Ок, забудьте пока про вариант №1. Есть еще вариант №2. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2018, 01:27 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Ну что? Факир был пьян - фокус не удался. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2018, 13:22 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
P.P.S. На самом деле. давно говорил, что в Java очень не хватает разделения кучи между Thread'ами. Т.е. как минимум своя eden-область у каждого Thread'а поинты следующие: 1. Возможность административно назначить ограничение памяти на уровне Thread'а (application WAR'ника в application server'е): Теперь код вида ListArray rubbish = new ListArray(); while ( true) { rubbish.add( new Object() ); } не сможет "завалить" JVM/application server. Свалиться только Thread/application 2. Можно смотреть статистику потребления памяти на уровне Thread/группа Thread/application 3. Сборка мусора copy-конструктором не будет зависить от "крутости" приложения. Чистим по Thread'ам. Хотя с принципами работы "новых" GC не знаком. G1 уже в эту сторону двигался. 4. Возможность NUMA-дружелюбного алоцирования памяти. Память для Thread'а выделяется на той ноде, где работает Thread. Проблемы: 1. Нужно как-то уметь понимать и обрабатывать объекты покидающие/могут покинуть (аналог escape-анализа) Thread. 2. Нужна какая-то синхронизация с диспетчером потоков, что бы при миграции потока на другую NUMA-ноду и его Heap мигрировать. Но тут все сложно. Как работает диспетчер потоков и какие алгоритмы закрепления потоков за ядрами/нодами и их миграция - для меня большая загадка. По практике - глюка глюкой, никак с документацией не соотносящаяся ))). А с учетом, что потоки хорошо бы еще и к ядру с обработчиком прерываний сетевого стека прикреплять (RSS Receive-Side Queue) - вооще на докторскую дисертация в области IT тянет ))). 3. Для application сервера вообще вырисовывается дерево heap'ов application сервер приложение на сервере (WAR) thread ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2018, 13:30 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev2) непонятно, что делать с функциями возвращающими строки. Теоретически, побороться можно, практически - фиг знает как реализовать. Или будет копирование туда-сюда обратно между кадрами стека или нужно память под возвращаемое значение в кадре вызывающей процедуры выделять (и передавать не явным парметром), но опять таки, размем буффера под строку заранее не известен (и даже, может меняться). У меня была идея о парадигме (близкой к ФП) языка где строк не существует но есть такие себе pure-functions которые генерируют потоки символов. Типа. Код: java 1.
Накладные расходы минимальны если работает lazy-механизм. Ну и весь API переколбасить соотв. Доступ к i-му элементу тоже возможен но это будет как-раз отступление от потоков и движение в сторону других строк. Неэкономных. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2018, 13:39 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
mayton...о парадигме (близкой к ФП) языка где строк не существует но есть такие себе pure-functions которые генерируют потоки символов... Ты представляешь какой "взрыв мозга" кодировать в такой парадигме? Для отчетных систем / сборка отчетов - возможно и осмысленно. А для универсального языка программирования - это какой-то освенцем и дурдом для программистов ))) Такое частилище, что потом 9-кругов ада пионерским лагерем покажутся ))) IMHO ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2018, 13:45 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
maytonТебе по идее вообще не нужна строка. У тебя сервлет. И у него где то есть OutputStream. Вот туда и надо нацелить html bulder.вот тут и проявляется. у меня ws. и тут только строка или бинари. и строка, как ни крути, останется строкой. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2018, 13:49 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev2. Можно смотреть статистику потребления памяти на уровне Thread/группа Thread/application Статистика это +1000 Меня всегда интересовал сбор информации о частоте дёргания new в исходниках и о времени жизни порождаемых объектов. Думалось так: Здесь делаем хинт аллокатору что объект сразу будет вечным. Код: java 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2018, 13:55 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsevmayton...о парадигме (близкой к ФП) языка где строк не существует но есть такие себе pure-functions которые генерируют потоки символов... Ты представляешь какой "взрыв мозга" кодировать в такой парадигме? Для отчетных систем / сборка отчетов - возможно и осмысленно. А для универсального языка программирования - это какой-то освенцем и дурдом для программистов ))) Такое частилище, что потом 9-кругов ада пионерским лагерем покажутся ))) IMHO Давай подумаем. Из API стримов выпадает только взятие симаола по индексу. Или substr(m,n). Все остальное работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2018, 13:57 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev1. Нужно как-то уметь понимать и обрабатывать объекты покидающие/могут покинуть (аналог escape-анализа) Thread. Я-бы добавил профайлер survival областей. Мне кажется там лежат самые подозрительные объекты. Это еще не старички. Но уже и не Эдемский сад. Вобщем их идентифицировать и понять где в коде они были созданы. Возможно будет много точек в коде где есть конструктора и фабрики. И такие точки надо подсвечивать красным примерно как это делает SonarQube. Отчот по memory-performance включает в себя этих перебежчиков. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2018, 14:01 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
mayton, а зачем столько головняков? почему не остановиться на StringBuilder? ведь там есть всё, что нужно для работы со строками . только останется выяснить как ведёт себя .delete Код: plaintext 1. 2.
освобождается ли память ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2018, 14:10 |
|
|
start [/forum/topic.php?fid=59&startmsg=39706716&tid=2121729]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
43ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
others: | 416ms |
total: | 558ms |
0 / 0 |