Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Вторничная штука / 22 сообщений из 22, страница 1 из 1
01.12.2020, 21:22
    #40023777
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вторничная штука
Вот такая штука.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
/**
 * SkimpyMap is map with minimal footprint
 *
 * - contains no buckets
 * - contains from 0 to 2 keys
 * - lookup is linear :)
 * - lookup is still fast because of ... Aha-ha..:)
 */
public class SkimpyMap<K,V> implements Map<K,V> {

    public static final int MAX_KEYS = 2;

    private Object[] keys;
    private Object[] values;

    .....



Обсудите
...
Рейтинг: 0 / 0
02.12.2020, 04:38
    #40023833
crutchmaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вторничная штука
mayton,

Но зачем?
...
Рейтинг: 0 / 0
02.12.2020, 07:05
    #40023836
crutchmaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вторничная штука
В смысле зачем нужен map из двух элементов?
...
Рейтинг: 0 / 0
02.12.2020, 10:16
    #40023851
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вторничная штука
Я решил что 2 элемента составляют некий технический порог. Когда массив ещё конкурирует с хешмапой. Впрочем нужен хороший jmh тест.

Но можно сделать и 3 элемента.
...
Рейтинг: 0 / 0
02.12.2020, 12:09
    #40023905
Alexander A. Sak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вторничная штука
Flat3Map изобретаете?
...
Рейтинг: 0 / 0
02.12.2020, 12:17
    #40023915
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вторничная штука
Хм.. может быть. Надо глянуть сорцы.
...
Рейтинг: 0 / 0
02.12.2020, 13:38
    #40023949
faustgreen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вторничная штука
Мне одному кажется, что железо в скором времени дорастет до тех высот, когда уже будет все равно ArrayList там использовать, или LinkedList для вставки в начало?
...
Рейтинг: 0 / 0
02.12.2020, 14:02
    #40023958
lleming
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вторничная штука
faustgreen
Мне одному кажется, что железо в скором времени дорастет до тех высот, когда уже будет все равно ArrayList там использовать, или LinkedList для вставки в начало?


Врядли. Уже 20 лет как
...
Рейтинг: 0 / 0
02.12.2020, 14:15
    #40023963
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вторничная штука
Ну если интересно, то в scala реализованы специальные подклассы для мапы содержащей один элемент, два, три и четыре. и только если количество увеличивается больше четырех - тогда уже в ход идет обычная мапа.
...
Рейтинг: 0 / 0
02.12.2020, 14:33
    #40023966
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вторничная штука
Ну в Java тоже есть мапа для 1 ключа.

Поясню откуда возник вопрос. Несколько лет назад я смотрел dump одной продуктовой системы (JBoss+App)
и заметил что большая часть объектов - это реализации HashMap или ConcurrentHashMap.

И меня заинтересовал footprint.
...
Рейтинг: 0 / 0
02.12.2020, 15:29
    #40023985
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вторничная штука
mayton
....
И меня заинтересовал footprint.


private Object [] keys;
...
Рейтинг: 0 / 0
02.12.2020, 16:35
    #40024004
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вторничная штука
Какие будут предложения?
...
Рейтинг: 0 / 0
02.12.2020, 17:06
    #40024015
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вторничная штука
Не использовать ))) ни стандартные коллекции, ни box'инг/unbox'инг
...
Рейтинг: 0 / 0
03.12.2020, 02:34
    #40024117
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вторничная штука
На корректность не проверял еще. Надеюсь работает хотя-бы правильно.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
@State(Scope.Thread)
@BenchmarkMode(Mode.Throughput)
@Warmup(iterations = 1)
@Fork(1)
@Measurement(iterations = 3)
public class MyBenchmark {

    private SkimpyMap<String,String> skimpyMap = new SkimpyMap<>();

    private Map<String, String> hashMap = new HashMap<>();

    private Map<String, String> javaTreeMap = new HashMap<>();

    @Setup
    public void setup() {

    }

    @Benchmark
    public void skimpy() {
        skimpyMap.put("1","");

        skimpyMap.put("2","");
        skimpyMap.remove("1");

        skimpyMap.put("3","");
        skimpyMap.remove("2");

        skimpyMap.put("4","");
        skimpyMap.remove("3");

        skimpyMap.remove("4");

        skimpyMap.clear();
    }

    @Benchmark
    public void hash() {
        hashMap.put("1","");

        hashMap.put("2","");
        hashMap.remove("1");

        hashMap.put("3","");
        hashMap.remove("2");

        hashMap.put("4","");
        hashMap.remove("3");

        hashMap.remove("4");

        hashMap.clear();
    }

    @Benchmark
    public void tree() {
        javaTreeMap.put("1","");

        javaTreeMap.put("2","");
        javaTreeMap.remove("1");

        javaTreeMap.put("3","");
        javaTreeMap.remove("2");

        javaTreeMap.put("4","");
        javaTreeMap.remove("3");

        javaTreeMap.remove("4");

        javaTreeMap.clear();
    }



Код: java
1.
2.
3.
4.
Benchmark            Mode  Cnt         Score         Error  Units
MyBenchmark.hash    thrpt    3  16026559.188 ± 2335586.914  ops/s
MyBenchmark.skimpy  thrpt    3  15609958.668 ± 3353609.697  ops/s
MyBenchmark.tree    thrpt    3  15744633.323 ± 1522374.688  ops/s
...
Рейтинг: 0 / 0
03.12.2020, 07:37
    #40024122
crutchmaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вторничная штука
faustgreen
Мне одному кажется, что железо в скором времени дорастет до тех высот

Некоторые вполне себе используют ArrayList вместо Set на 10к+ элементов. Ну а чо? Всё, что меньше секунды - это мгновенно.
...
Рейтинг: 0 / 0
03.12.2020, 10:26
    #40024156
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вторничная штука
Я только щас вспомнил. Была библиотечка. Кажется trove называется.
Там - рациональное использование бакетов. Кажется метод прямой адресации.
Но я - не юзал ни разу. Можно попробовать ее в бенчмарк.

Да. И еще. Яж футпринт так и не измерял. Причем тут надо deep а не shallow.
Буду думать как мерять.
...
Рейтинг: 0 / 0
03.12.2020, 16:26
    #40024298
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вторничная штука
mayton
Я только щас вспомнил. Была библиотечка. Кажется trove называется.
Там - рациональное использование бакетов. Кажется метод прямой адресации.


Во-первых она не была, а есть.
Там просто упор на объём, а не скорость. Массив, хэшкод- это индекс, если занято - сдвиг на некоторое число. Поиск и вставка медленнее, зато массив намного меньше, чем число бакетов, и нет никаких списков/деревьев в бакете.
...
Рейтинг: 0 / 0
03.12.2020, 18:01
    #40024322
vimba
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вторничная штука
mayton
Вот такая штука.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
/**
 * SkimpyMap is map with minimal footprint
 *
 * - contains no buckets
 * - contains from 0 to 2 keys
 * - lookup is linear :)
 * - lookup is still fast because of ... Aha-ha..:)
 */
public class SkimpyMap<K,V> implements Map<K,V> {

    public static final int MAX_KEYS = 2;

    private Object[] keys;
    private Object[] values;

    .....



Обсудите

Если засунуть и ключи и значения в один массив то сэкономите на аллокации ещё одного объекта.
...
Рейтинг: 0 / 0
03.12.2020, 18:49
    #40024329
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вторничная штука
vimba,

Тогда тип ключа и объекта должен совпадать. В общем, усложнее кода не очень понятное ради чего.

По тестам mayton'а, если я правильно понял, пока его мапа стандартной проигрывает )))

Ну и если примитивные типы (int,long), что чаще всего и нужно, то взять нормальные не-стандартные коллекции и радоваться профиту от отсутствия box/unbox'инга.
...
Рейтинг: 0 / 0
03.12.2020, 19:23
    #40024337
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вторничная штука
Leonid Kudryavtsev
vimba,

Тогда тип ключа и объекта должен совпадать. В общем, усложнее кода не очень понятное ради чего.

По тестам mayton'а, если я правильно понял, пока его мапа стандартной проигрывает )))

Ну и если примитивные типы (int,long), что чаще всего и нужно, то взять нормальные не-стандартные коллекции и радоваться профиту от отсутствия box/unbox'инга.

Она не то чтобы проигрывает. Она - на 0-1-2 ключа ведет себя ПОЧТИ как хеш-мапа. Но если я увеличу
число ключей до 3-4 тогда будет проявлен линейный поиск и она начнет проигрывать.
...
Рейтинг: 0 / 0
03.12.2020, 19:25
    #40024338
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вторничная штука
Alexey Tomin
mayton
Я только щас вспомнил. Была библиотечка. Кажется trove называется.
Там - рациональное использование бакетов. Кажется метод прямой адресации.


Во-первых она не была, а есть.
Там просто упор на объём, а не скорость. Массив, хэшкод- это индекс, если занято - сдвиг на некоторое число. Поиск и вставка медленнее, зато массив намного меньше, чем число бакетов, и нет никаких списков/деревьев в бакете.

Я посмотрел. Там упор сделан на работу с примитивами. И нет generic-подхода который используется
везде. Если посмотреть под углом Java-generics то эта библиотека - есть молчаливый упрёк в адрес
"плохой" реализации генериков Java по сравнению с С++/Scala например.
...
Рейтинг: 0 / 0
03.12.2020, 23:09
    #40024403
vimba
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вторничная штука
Leonid Kudryavtsev
vimba,

Тогда тип ключа и объекта должен совпадать. В общем, усложнее кода не очень понятное ради чего.

Нет, в массив объектов можно пихать всё что захочешь. Обратите внимание что тип массивов уже не совпадают ни с типом ключа ни с типом значения
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Вторничная штука / 22 сообщений из 22, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]