|
|
|
trove4j - не пора ли на свалку.
|
|||
|---|---|---|---|
|
#18+
Есть некий проект, в котором узким местом является работа в set'ом (я сам офигел- но это факт, подтверждённый инструментацией). Когда-то давно в качестве реализации был выбран THashSet из trove4j. Сейчас- похоже, что проблемным стало вот что- иногда некоторые set'ы резко вырастают - до 6М элементов, потом размер проседает до 300К. А вставка в сет идёт достаточно хитрым путём - gnu.trove.impl.hash.TObjectHash#insertKeyRehash Смотрю на trove4j - он не обновляется с 2012го года. А JDK за это время как раз хорошо оптимизировали. Как кто считает- стоит ли попробовать перести на стандартный HashSet? Там, конечно, внутри тот ещё оверинжиниринг (Map'ы)... Или может гугл что хорошее написал? --<br /> Алексей.<br /> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2016, 09:44 |
|
||
|
trove4j - не пора ли на свалку.
|
|||
|---|---|---|---|
|
#18+
А написать синтетический тест для случая "set'ы резко вырастают - до 6М элементов, потом размер проседает до 300К" ? Все же IMHO, паттерн использования весьма специфический. Посмотрел на исходники, они зачем то ищут именно до free slots, параллельно просматривая removed. Если понимать, что делаешь, вполне можно создать свой класс и переопределить protected int insertKey(T key). Но тут я не советчик, знания об алгоритмах у меня не достаточно хорошее, что бы понять, почему у них именно такая реализация. IMHO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2016, 12:18 |
|
||
|
trove4j - не пора ли на свалку.
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevА написать синтетический тест для случая "set'ы резко вырастают - до 6М элементов, потом размер проседает до 300К" ? Все же IMHO, паттерн использования весьма специфический. Посмотрел на исходники, они зачем то ищут именно до free slots, параллельно просматривая removed. Если понимать, что делаешь, вполне можно создать свой класс и переопределить protected int insertKey(T key). Но тут я не советчик, знания об алгоритмах у меня не достаточно хорошее, что бы понять, почему у них именно такая реализация. IMHO Ага. Более того- это set WeakReference. Т.е. мысль- либо уйти на WeakHashMap, либо , действительно, переписать insertKey, который будет считать "опустевшие" ссылки пустыми. Думаю пока, пробую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2016, 14:17 |
|
||
|
trove4j - не пора ли на свалку.
|
|||
|---|---|---|---|
|
#18+
Само по себе вырастание до 6М - не при чем. Это зависит не от реализации сета, а от кол-ва данных, которые вы туда засовываете и от load factor-а. Много данных - большой размер Set'а. От реализации, конечно, тоже зависит, но на JDK-шной данных можно ждать больше в несколько раз (зависит еще от типа элементов). Судить о узком месте надо не по размеру данных внутри сета, а о том, как часто возникают коллизии, как часто происходит перехеширование всего. Или какие-то другие показатели. Если 6М выглядит многоватым - то это очевино, не сет виноват. Ему-то что? Сколько в него положили - все его. Это либо что-то не то со всем алгоритмом (например, подозрительно много данных генерит), или вы неверно оценили объем данных, с которыми работаете. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2016, 15:55 |
|
||
|
trove4j - не пора ли на свалку.
|
|||
|---|---|---|---|
|
#18+
Там в исходном коде, проверка для выхода из цикла НЕ на любой свободный элемент в set'е ("free slots", "removed"), а именно на "free slots". Т.ч. если сет сначала разросся, а потом сжался и 99.99% элементов стало "removed", то наверное может быть замедление. Но почему так сделано - не понятно. Наверное были свои причины. Разбираться желания нет. Пусть автор топика разбирается ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2016, 16:20 |
|
||
|
trove4j - не пора ли на свалку.
|
|||
|---|---|---|---|
|
#18+
Alexey Tomin, надо смотреть в корень. А имеено - зачем здесь был THashSet ? Про саму библиотеку trove пишут что она использует примитивы вместо врапперов. http://trove.starlight-systems.com/ Возможно люди, которые ее заюзали преследовали какие-то задачи оптимизации memory e.t.c. Попробовать перевести - можно. Ну ... там тестов поболее чтоб покрыть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2016, 17:11 |
|
||
|
trove4j - не пора ли на свалку.
|
|||
|---|---|---|---|
|
#18+
mayton...она использует примитивы вместо врапперов.... Я сейчас юзаю http://fastutil.di.unimi.it/ Как она будет вести себя в ситуации описанной топик стартером - не знаю. Все же, у него паттерн достаточно редкий. Лично у меня данные просто сначала добавляются, потом используются. Переиспользование коллекций достаточно редко происходит (да и то, только в том случае, если они 100% совпадают по размеру, если отличаются - грохаю и создаю новые). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2016, 18:37 |
|
||
|
trove4j - не пора ли на свалку.
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevТам в исходном коде, проверка для выхода из цикла НЕ на любой свободный элемент в set'е ("free slots", "removed"), а именно на "free slots". Т.ч. если сет сначала разросся, а потом сжался и 99.99% элементов стало "removed", то наверное может быть замедление. Но почему так сделано - не понятно. Наверное были свои причины. Разбираться желания нет. Пусть автор топика разбирается ))) Разобрался. Там несложно. Когда мы вставляем элемент V1, потом V2 с хэшсетов, приводящим первоначально в тот же элемент (совпал hash % _set.length) - то элемент будет вставлен по индексу +probe. Если мы после этого удалим V1, а потом вставим ещё раз V2, то мы сразу наткнёмся на REMOVED элемент. Если мы вставим его сразу- то V2 будет в set'е дважды. Поэтому надо запомнить позицию, но добрести до FREE элемента (либо до equals). Фигня в том, что при частой удалении/вставке мы бродим по set'у в поисках свободного угла ОЧЕНЬ долго. Авторы кода, который я оптимизирую, решили съэкономить память (не использовав WeakHashMap) и, как результат, теперь это создаёт проблемы производительности. Правда истинная причина совершенно в другом месте, но тот код я пока не в состоянии исправить- приходится костылять ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2016, 18:59 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39251227&tid=2123998]: |
0ms |
get settings: |
11ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
47ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
| others: | 251ms |
| total: | 408ms |

| 0 / 0 |
