*
  Мысли   Галерея   Проекты   Тексты  
  Мысли   Галерея   Проекты   Тексты  
Giver: Primitive Collections  (2014-02-17 14:50:54)

Производительности никогда не бывает мало. Всегда хочется быстрее, компактнее и красивее. В яве сложная ситуация с примитивами. Загвоздка в том, что они есть. И они не объекты. А так хочется иногда карту с целочисленным ключом. И вот в своей разработки применив все мыслимые и немыслимые оптимизации и получив прирост только в 30%, я решил поменять контейнер. Уж тут-то я получу сразу хорошее ускорение. Памяти тоже не хватает, так что и тут должен быть выигрыш.

Для этого я написал небольшой тест. Вот такого плана. У каждой реализации свой API, поэтому примеры весьма отличаются. Но смысл общий.

Map<Integer, Map<Integer, Map<Integer, int[]>>> map;
//Insert
for(Data in : data) {
    Map r = map.get(in.a);
    if(r == null) map.put(in.a, r = new Map());    

    Map k = r.get(in.a);
    if(k == null) map.put(in.a, k = new Map());

    int[] l = k.get(in.a);
    if(l == null) map.put(in.a, r = new int[1]);
    l[0]++;
}
// Walk
int c;
for(Map a : map.values())
    for(Map b : a.values())
        for(int[] k : a.values())
            c++;

Результаты порадовали. Даже картинка не требуется чтобы их понять. Тратить время с подобными коллекциями смысла нет никакого.

Framework - class Insert Walk Memory
JCF - HashMap 1005000 in 5055ms (~0,00503ms) 2794144 in 761ms (~0,00027ms) 301,6Mb
JCF - LinkedHashMap 1005000 in 6446ms (~0,00641ms) 2794441 in 646ms (~0,00023ms) 359,4Mb
HCCP - IntObjectOpenHashMap 1005000 in 5113ms (~0,00509ms) 2793747 in 643ms (~0,00023ms) 355,7Mb
GNU Trove - TIntObjectHashMap 1005000 in 5477ms (~0,00545ms) 2793979 in 3134ms (~0,00112ms) 461,1Mb
fastutil - Int2ObjectOpenHashMap 1005000 in 4979ms (~0,00495ms) 2793682 in 960ms (~0,00034ms) 510,8Mb
fastutil - Int2ObjectAVLTreeMap 1005000 in 7201ms (~0,00717ms) 2793393 in 1054ms (~0,00038ms) 287,9Mb

А еще порадовал размер fastutil — его ярка занимает 16 мегабайт. в два раза больше чем мой проект со всеми зависимостями вместе взятыми.


Имя:
Комментарий: